python scoket 以及多线程实现聊天

python scoket编程以及多线程

Socket 模块的类方法 (能直接通过类名调用)

Socket低层网络接口(每个 BSD API)
socket.socket(family, type)创建并返回一个新的 socket 对象
socket.getfqdn(name)将使用点号分隔的 IP 地址字符串转换成一个完整的域名
socket.gethostbyname(hostname)将主机名解析为一个使用点号分隔的 IP 地址字符串
socket.fromfd(fd, family, type)从现有的文件描述符创建一个 socket 对象

Socket 模块的实例方法

sock.bind( (adrs, port) )将 socket 绑定到一个地址和端口上
sock.accept()返回一个客户机 socket(带有客户机端的地址信息)
sock.listen(backlog)将 socket 设置成监听模式,能够监听 backlog 外来的连接请求
sock.connect( (adrs, port) )将 socket 连接到定义的主机和端口上
sock.recv( buflen[, flags] )从 socket 中接收数据,最多 buflen 个字符
sock.recvfrom( buflen[, flags] )从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号
sock.send( data[, flags] )通过 socket 发送数据
sock.sendto( data[, flags], addr )通过 socket 发送数据
sock.close()关闭 socket

客户端(client)

import socket   
import threading
import sys

true = 1
def rec(sock):
    #将接收消息部分封装成一个函数,方便下面为其建立一个线程
    
    global true    #声明这里的true为全局变量,即是上面声明的true=1

    #如果无数据报套接字则退出
    if not sock:
        sys.exit(-1)

     while True:
        #通过recvfrom函数接收数据
        buf,address = sock.recvfrom(2048)
        
        #接收到对面退出,则退出
        if buf.decode() == 'q':
            true = 'q'
            break

        #打印接收的数据        
        print("accept content:   ", end='')
        print(buf.decode())
    
    return buf,address

<font color=red>#主程序</font>

if __name__ == '__main__': 

    #创建scoket,并判断是否创建成功
    #数据报套接字是对于udp协议的,面向无连接的
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)     #数据报套接字
    if not sock:
        print('socket error')

    #绑定套接字,指定端口(若不指定则使用默认9999端口)
    port = input('port:  ')
    if port:
        sock.bind(('localhost', int(port)))
#        print('hello')
#        print(sock.type)
    else:
        sock.bind(('localhost',9999)) 

    #为接收消息开创一个线程    
    ser = threading.Thread(target=rec, args=(sock,))
    ser.start()
    
    while True:
        
        if true == 'q':
            break
        
        #发送数据
        try:
            data = input('\nsending content:     ')
            
            #sendto函数向指定IP地址发送消息
            sock.sendto(data.encode(),('localhost', 8001))
        except socket.gaierror:
            print ('Error connecting to server: %s')
        
    sock.close()        #关闭套接字


服务端(server)

# -*- coding: utf-8 -*-
import socket
import threading
import sys

true = 1

def rec(sock):
    
    global true
    
    #如果无数据报套接字则退出
    if not sock:
        sys.exit(-1)
        
    while True:
        #接收数据
        buf,address = sock.recvfrom(2048)
        
        #接收到对面退出,则退出
        if buf.decode() == 'q':
            true = 'q'
            break

        else:
            print("accept content:   ", end='')
            print(buf.decode())
    
    return buf,address

<font color=red>#主程序</font>
if __name__ == '__main__': 

    #创建scoket,并判断是否创建成功
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)     #数据报套接字
    if not sock:
        print('socket error')

    #绑定套接字,指定端口(若不指定则使用默认8001端口)
    port = input('port:  ')
    if port:
        sock.bind(('localhost', int(port)))

else:
        sock.bind(('localhost', 8001)) 
        
    ser = threading.Thread(target=rec, args=(sock,))
    ser.start()

while True:
        
        if true == 'q':
            break
        
        #发送数据
        data = input('\nsending content:     ')
        sock.sendto(data.encode(),('localhost', 9999))

    sock.close()        #关闭套接字

在.py文件目录下通过shift+鼠标右键打开powershell窗口
python client.py运行程序
服务端

客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值