首先给出这个java的Server代码
try{//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket=new ServerSocket(8899);
Socket socket;
System.out.println("***服务器即将启动,等待客户端的连接***");//循环监听等待客户端的连接
while(true){//调用accept()方法开始监听,等待客户端的连接
socket=serverSocket.accept();//创建一个新的线程
InputStream is=null;
OutputStream os=null;try{//获取输入流,并读取客户端信息
is =socket.getInputStream();byte[] bb = new byte[8]; //缓冲器
try{while((is.read(bb))!=-1) { //从输入流读取一些字节数,并将它们存储到缓冲区b
System.out.println("服务端收到的字节数组为:");for (int i = 0; i < 8; i++) {
System.out.print(Utils.byteToHex(new byte[]{bb[i]}) + " ");//这里只是转换一下十六进制
}
System.out.println("");
}
}catch(IOException e) {
e.printStackTrace();
}//获取输出流,响应客户端的请求
os =socket.getOutputStream();byte[] b = {0x18, 0x06, 0x00,0x02,0x00,0x10,0x10,0x10};
os.write(b);
socket.shutdownOutput();
}catch(IOException e) {
e.printStackTrace();
}finally{//关闭资源
try{if(os!=null)
os.close();if(is!=null)
is.close();if(socket!=null)
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());
}
}catch(IOException e) {
e.printStackTrace();
}
Utils类下面的 byteToHex
/*** byte数组转hex
*@parambytes
*@return
*/
public static String byteToHex(byte[] bytes){
String strHex= "";
StringBuilder sb= new StringBuilder("");for (int n = 0; n < bytes.length; n++) {
strHex= Integer.toHexString(bytes[n] & 0xFF);
sb.append((strHex.length()== 1) ? "0" + strHex : strHex); //每个字节由两个字符表示,位数不够,高位补0
}returnsb.toString().trim();
}
然后把这个server接入python的客户端的访问的时候 说我这个server没有给其响应。
我在想是不是我这个server的响应有问题,流的关闭 连接的关闭等有问题。
就自己写了一个java的client来测试一下
public static void main(String[] args) throwsException{try{//1.创建客户端Socket,指定服务器地址和端口 192.168.1.7
Socket socket=new Socket("192.168.1.7", 8899);//2.获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputStream();//字节输出流//关灯光
byte[] b = {0x18,0x06,0x00,0x02,0x00,0x10,0x2B,(byte)0xCF};
os.write(b);
os.flush();
socket.shutdownOutput();//关闭输出流//3.获取输入流,并读取服务器端的响应信息
InputStream is=socket.getInputStream();byte[] bb = new byte[8]; //缓冲器
try{while((is.read(bb))!=-1) { //从输入流读取一些字节数,并将它们存储到缓冲区b
System.out.println("客户端收到的字节数组为:");for (int i = 0; i < 8; i++) {
System.out.print(Utils.byteToHex(new byte[]{bb[i]}) + " ");
}
System.out.println("");
}
}catch(IOException e) {
e.printStackTrace();
}//4.关闭资源
is.close();
os.close();
socket.close();
}catch(Exception e) {
e.printStackTrace();
}
}
然后先后启动 server和client 注意适当修改端口以及ip
server端的日志如下:
***服务器即将启动,等待客户端的连接***
服务端收到的字节数组为:
18 06 00 02 00 10 2b cf
当前客户端的IP:192.168.1.7
client端的日志如下:
客户端收到的字节数组为:
18 06 00 02 00 10 10 10
明明就是没有问题的。为什么非要说java的socketserver有问题呢?
然后我就用python写了一个client 代码细节不是太理解 抄网络上面的。python3.7
importsocketimportbinascii
HOST= '192.168.1.7'PORT= 50007s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))#!开灯 Received b'1806000300207a1b'
request = bytes([0x18, 0x06, 0x00, 0x03,0x00, 0x20, 0x7A, 0x1B])
s.sendall(request)
response= s.recv(1024)print('Received', response)
然后适当修改java server和python client的ip port保持一致 先后启动java的server 和 python的client.
java server日志如下:
***服务器即将启动,等待客户端的连接***
服务端收到的字节数组为:
18 06 00 03 00 20 7a 1b
python client端确实没有日志输出。
这个时候我想验证一下python client是否有问题。然后我写了一个python server 这个也是抄网上的。
import socket
import binascii
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
while True:
conn, address = s.accept()
request = conn.recv(1024)
print('Connected by', repr(address),
'Received ', binascii.hexlify(request))
if request:
conn.sendall(request)
修改python client 和python server的端口和ip 保持一致 先后启动python server python client。
python server端显示:
Connected by ('192.168.1.7', 31831) Received b'1806000300207a1b'
python的client端日志输出:
Received b'\x18\x06\x00\x03\x00 z\x1b'
这样是不是证明了
java的socketServer不能提供给python client的访问?
整个流程都是请求和响应字节数组。
大家有什么想法,这个是什么问题?