derezzed

导航

套接字(socket)初使用 / 基于TCP协议的socket

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

 

server端

import socket
import time
sk = socket.socket()

sk.bind(('127.0.0.1',8898))   #把地址绑定到套接字
'''
127.0.0.1是回送地址,指本地机,一般用来测试使用。
回送地址是本机回送地址(Loopback Address),
即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,
无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。
'''
'''
sk.listen()    #监听链接
conn,addr = sk.accept()   #接受客户端链接
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'this message from server')
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

'''
sk.listen()
conn,addr = sk.accept()
while 1:
    ret1 = conn.recv(1024)
    ret1 = ret1.decode('utf-8')
    print(ret1)
    if 'q' in ret1:
        break
    usr = input(">>>")
    conn.send(bytes('来自客户端\n发送时间%s\n%s'%(time.asctime(time.localtime(time.time())),usr),encoding='utf-8'))
    if usr == 'q':
        break
conn.close()
sk.close()

client端

import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1',8898))
'''
import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字
'''
while 1:
    usr1 = input('>>>')
    sk.send(bytes('来自客户端\n发送时间%s\n%s'%(time.asctime(time.localtime(time.time())),usr1),encoding='utf-8'))
    if usr1 == 'q':
        break
    ret2 = sk.recv(1024)
    ret2 = ret2.decode('utf-8')
    print(ret2)
    if 'q' in ret2:
        break

sk.close()

问题:有的同学在重启服务端时可能会遇到

解决方法:

#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)   #接收客户端信息
print(ret)              #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

 

posted on 2018-01-25 18:36  derezzed  阅读(188)  评论(0)    收藏  举报