我的第一个python之socket通信程序

刚刚开始接触python,实现了一个helloworld程序---关于udp协议的socket通信demo。

首先服务端这边的实现如下:

import socket, traceback

host = '' # Bind to all interfaces 
port = 51500

# Step1: 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Step2: 设置socket选项(可选)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Step3: 绑定到某一个端口
s.bind((host, port))

# Step4: 监听该端口上的连接
while 1:
    try:
        message, address = s.recvfrom(8192)
        print "Got data from ", address
        
        s.sendto("Data is received succeefully.", address)
    except (KeyboardInterrupt, SystemExit):
        print "raise"
        raise
    except :
        print "traceback"
        traceback.print_exc()
其中,host置为空,意思是可以绑定到所有的接口和地址,无论是哪个客户端的请求,只要是绑定到了同样的端口,那么服务器就可以监听到这个请求。

在tcp连接中,监听客户端的请求需要用到listen或accept函数,并有一个专门的socket和远程极其连接。

接着使我们的客户端实现:

import socket, sys

# Step1: 输入host和port信息
host = raw_input('please input host name: ')
textport = raw_input('please input textport: ')

# Step2: 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
    port = int(textport)
except ValueError:
    port = socket.getservbyname(textport, 'udp')
 
# Step3: 打开socket连接   
s.connect((host, port))

# Step4: 发送数据
print "Enter data to transmit: "
data = sys.stdin.readline().strip()
s.sendall(data)

# Step5: 接收服务器发过来的数据
print "Looking for replies; press Ctrl-C or Ctrl-Break to stop"
while 1:
    buf = s.recv(2048)
    if not len(buf):
        break
    sys.stdout.write(buf)

这个例子就是这么简单,实现起来和C语言版的差不多。看来,只要是了解socket编程的,用不同的语言实现也会相差无几。
<think>好的,用户想找关于Python中使用socket进行通信的示例程序或教程。让我先回顾一下用户提供的引用内容。引用[1]和[2]分别给出了TCP服务器端和客户端的代码示例,引用[3]和[4]提到了PHP与Python以及Python与PLC的socket通信。用户的问题主要集中在Python本身的socket通信示例,所以需要重点参考前两个引用。 首先,我需要确认用户的需求。他们可能需要一个基础的示例来理解socket通信的基本流程,包括服务器端和客户端的代码。根据引用[1]和[2],可以整理出标准的TCP通信流程:创建socket、绑定地址、监听连接、接受连接、收发数据,最后关闭连接。对于客户端,则是创建socket、连接服务器、发送和接收数据,然后关闭。 接下来,我需要检查这些代码是否符合Python的最佳实践,比如使用try-finally来确保连接关闭,处理可能的异常,以及正确的编码解码方式。例如,引用[1]的服务器端代码在接收数据后,将数据原样发回,而客户端在发送消息后等待响应,这展示了基本的回显功能。 另外,用户可能关心如何处理多客户端连接的情况。在引用[1]的示例中,服务器一次只能处理一个连接,因为它在接受连接后进入循环,没有使用多线程或多进程。因此,在回答中可以提到这一点,并给出改进的示例,比如使用多线程来处理多个客户端。 还需要考虑不同的协议类型,比如UDP和TCP的区别。引用中的示例都是基于TCP的,所以可能需要在相关问题中提到UDP的实现方式,或者指出两者的不同应用场景。 另外,用户可能遇到的一些常见问题,比如地址已被占用、端口问题、数据编码错误等,可以在注意事项中提及,帮助用户避免常见陷阱。例如,使用socket.SO_REUSEADDR选项来避免地址占用问题,或者在发送数据前确保正确编码为字节流。 最后,根据用户要求生成相关问题,可以包括性能优化、多客户端处理、不同编程语言间的通信以及错误处理等方面的问题,帮助用户进一步学习。 总结一下,回答的结构应该是先给出基础的TCP服务器和客户端代码,解释关键步骤,然后提供UDP的示例,接着讨论注意事项,最后生成相关问题。确保代码格式正确,使用中文解释,并引用提供的参考资料。</think>### Python Socket通信基础示例程序 #### 一、TCP通信基础实现 1. **服务端代码**(基于引用[1]优化) ```python import socket def tcp_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 避免地址占用问题 server_socket.bind(('localhost', 12345)) server_socket.listen(5) # 设置最大等待连接数 print("TCP服务端已启动,等待连接...") while True: conn, addr = server_socket.accept() with conn: print(f"客户端 {addr} 已连接") while True: data = conn.recv(1024) if not data: break print(f"收到数据: {data.decode('utf-8')}") conn.sendall(b"Server reply: " + data) # 添加响应头标识 ``` 2. **客户端代码**(基于引用[2]扩展) ```python import socket def tcp_client(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: client_socket.connect(('localhost', 12345)) message = input("请输入要发送的内容: ") client_socket.sendall(message.encode('utf-8')) response = client_socket.recv(1024) print(f"服务器响应: {response.decode('utf-8')}") except ConnectionRefusedError: print("连接被拒绝,请检查服务器状态") finally: client_socket.close() ``` #### 二、UDP通信实现 1. **服务端代码** ```python import socket def udp_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind(('localhost', 54321)) print("UDP服务端已启动") while True: data, addr = server_socket.recvfrom(1024) print(f"收到来自 {addr} 的消息: {data.decode()}") server_socket.sendto(b"UDP_ACK: " + data, addr) ``` 2. **客户端代码** ```python import socket def udp_client(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_address = ('localhost', 54321) message = input("请输入UDP消息: ") client_socket.sendto(message.encode('utf-8'), server_address) response, _ = client_socket.recvfrom(1024) print(f"收到响应: {response.decode()}") client_socket.close() ``` #### 三、关键步骤说明 1. **协议选择**: - TCP:需建立连接,保证数据可靠性(如引用[1][2]) - UDP:无连接,更高传输效率但可能丢包 2. **地址绑定**: - 使用$bind((host, port))$绑定端口(如引用[1]第5行) 3. **数据编解码**: - 必须使用$encode()/decode()$处理字符串与字节流转换(如引用[2]第13行) 4. **异常处理**: - 建议添加$try...except$块处理网络中断等异常(如引用[2]的异常处理) #### 四、注意事项 1. **多客户端处理**: - 上述TCP服务端是单线程版本,实际开发中需使用多线程处理并发: ```python from threading import Thread def handle_client(conn, addr): # 处理逻辑同前文TCP服务端 while True: conn, addr = server_socket.accept() Thread(target=handle_client, args=(conn, addr)).start() ``` 2. **协议选择场景**: - 实时视频传输推荐UDP - 文件传输推荐TCP 3. **跨语言通信**: - 需统一编码格式(如UTF-8)和数据封包方式(如引用[3]的PHP-Python交互)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值