经本人填坑 + 测试,完全可以用!
注:Python服务端可无限循环接收Java客户端发出的数据
Python做SocketServer服务端:这里给出三个版本,原理类似,写法稍有不同
写法1:
import socket
try:
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
print("create socket succ!")
sock.setblocking(False)
sock.bind(('127.0.0.1',55533))
print('bind socket succ!')
sock.listen(5)
print('listen succ!')
except:
print("init socket error!")
while True:
try:
# print("listen for client...")
conn,addr=sock.accept()
print("get client")
print(addr)
conn.settimeout(30)
szBuf=conn.recv(1024)
print("recv:"+str(szBuf,'UTF-8'))
if "0"==szBuf:
conn.send(b"Exit")
else:
conn.send(b"Welcome Java SocketClient")
conn.close()
print("end of servive")
except:
pass
写法2:
from socket import *
HOST = '127.0.0.1'
PORT = 55533
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpServerSock = socket(AF_INET,SOCK_STREAM)
tcpServerSock.bind(ADDR)
tcpServerSock.listen(5)
while True:
print('waiting for connection')
tcpClientSock, addr = tcpServerSock.accept()
print('connnecting from :', addr)
while True:
data = tcpClientSock.recv(BUFSIZ)
if not data:
break
print("java客户端发送过来的内容:" + str(data, 'UTF-8'))
tcpClientSock.send(b"Welcome Java SocketClient")
tcpClientSock.close()
tcpServerSock.close()
写法3:
# coding:utf-8
import socket
# 开启ip和端口
ip_port = ('127.0.0.1', 55533)
# 生成一个句柄
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 立即释放端口
#sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 非阻塞
# sk.setblocking(False)
# 绑定ip端口
sk.bind(ip_port)
# 最多连接数
sk.listen(5)
# 开启死循环
while True:
print('server 55533 running...')
# 等待链接,阻塞,直到渠道链接 conn打开一个新的对象 专门给当前链接的客户端 addr是ip地址
try:
conn, addr = sk.accept()
# 获取客户端请求数据
conn.settimeout(1)
client_data = conn.recv(1024)
# 打印对方的数据szBuf,'UTF-8'
print(str(client_data, 'UTF-8'))
print(1)
# 向对方发送数据
conn.send(b'aaaa')
# 关闭链接
conn.close()
except BlockingIOError:
pass
Java做SocketClient客户端:这里给出一个版本
package com.hitachi.utils;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class SocketClient {
public static void main(String args[]) throws Exception {
// 要连接的服务端IP地址和端口
String host = "127.0.0.1";
int port = 55533;
String message = "Hello Python SocketServer ";
String socketServerMsg = getSocketServerMsg(host, port, message);
System.out.println("接收的服务端信息:"+socketServerMsg);
}
public static String getSocketServerMsg(String host,int port,String message) throws Exception {
// 与服务端建立连接
Socket socket = new Socket(host, port);
// 获得输出流
OutputStream outputStream = socket.getOutputStream();
PrintWriter pWriter = new PrintWriter(outputStream);
pWriter.write(message);
pWriter.flush();
//通过shutdownOutput高速服务器已经发送完数据,后续只能接受数据
socket.shutdownOutput();
// 获得输入流
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len,"UTF-8"));
}
inputStream.close();
outputStream.close();
socket.close();
return sb.toString();
}
}