2 abcdmn3721 abcdmn3721 于 2016.04.21 15:28 提问

java socket客户端和Python socket客户端的不同?高C币!!

我们接的项目有一个java写的server,我只有它的文档,并且用java已经实现,但是现在要为
python实现,用java实现的代码:

 public static void main(String[] args) throws WindException,   SendException, RecvException{
String host="172.22.128.16";
int port=6001;
TcpComm tcp = new TcpComm(true);
try {
    tcp.call(host,port);
    tcp.setTimeOut(30);
    String msg="POF001|S2B024|01|0033596105||";
    byte[] req = msg.getBytes();
    tcp.sendMsg(req);
    byte[] ans = tcp.recvBytesMsg();
    System.out.println(ans);
} catch (CallException e) {
    e.printStackTrace();
}

接口就是使用socket发送一个定制的代表内容长度的报文头和内容,sendMsg方法:

 public void sendMsg(byte[] b) throws SendException {
        try {
            OutputStream out = sock.getOutputStream();
            if (hasAtrHead) {
                byte[] sbt = short2Byte((short) b.length, true);
                out.write(head);
                out.write(sbt);
            }
            out.write(b);
            out.flush();
        }

其中hasAtrrHead使用的是true,定制报文头的方法:

 static public byte[] short2Byte(short value, boolean order) {
        byte[] bt = new byte[2];
        if (order) { // true 高8位 存放在tb[0]
            bt[0] = (byte) (value >> 8 & 0xff);
            bt[1] = (byte) (value & 0xff);
        } else {
            bt[1] = (byte) (value >> 8 & 0xff);
            bt[0] = (byte) (value & 0xff);
        }
        return bt;
    }

使用以上java代码运行没问题,但是当我用python写的时候,发送的socket没有被server接收到,应该是发送的格式不对,python代码:

 #-*- coding:GBK -*-
import socket
class Comm(object):
    def heads(self,length):
        bt=bytearray()
        bt.append(length >> 8 & 0xff)
        bt.append(length & 0xff)
        return bt
    def client(self):
        HOST='172.22.128.16'
        PORT=6001
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.connect((HOST,PORT))       
        while 1:
            content='POF001|F2B107|01|3061009458||'
            length=len(content)
            head=self.heads(length)
            content=bytearray(content)
            s.send(head)
            s.send(content)
            data=s.recv(2048)    
        s.close()

if __name__=='__main__':
    a=Comm()
    a.client()

有人能告诉我到底是哪里不同吗?折腾两天了,求解答!!!

4个回答

abcdmn3721
abcdmn3721   2016.04.25 17:15
已采纳

问题已被自己解决,python中如直接转化数字为byte为4个字节,如需两个字节的网络序byte,需使用struct.pack('!h',x)

CSDNXIAON
CSDNXIAON   2016.04.21 15:32

java 通过 socket 实现 服务器和客户端的通信 TCP
java的socket编程---telnet客户端的实现
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

oyljerry
oyljerry   Ds   Rxr 2016.04.21 22:05

你python中content是字符串 而java发送的是byte字节数组 你需要转换一下再发送

abcdmn3721
abcdmn3721 已经转换了啊,用的bytearray
大约 2 年之前 回复
abcdmn3721
abcdmn3721   2016.04.25 17:15

问题已被自己解决,python中如直接转化数字为byte为4个字节,如需两个字节的网络序byte,需使用struct.pack('!h',x)

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
通过远程连接socket得到客户端的IP和连接端口
TCP:通过远程连接socket得到客户端的IP和连接端口SOCKETacceptSock;acceptSock = accept(listenSock, NULL, NULL); SOCKADDR_IN   sockAddr; int   iLen=sizeof(sockAddr); getpeername(acceptSock ,(struct   sockaddr   *)&sockAddr,&iLen);//得到远程IP地址和端口号  注意函数参数1:此处是接受连接                
服务端的通信socket号与客户端的通信socket号一致吗?---不一致
本文不阐述什么大问题, 仅仅做一个简单的验证:服务端的通信socket号与客户端的通信socket号不一致         下面, 我们看服务端程序: #include #include // winsock接口 #pragma comment(lib, "ws2_32.lib") // winsock实现 int main() { WORD wVersionRequested; /
Socket编程(二)随时接收客户端消息及多客户端连接
使服务器具有随时接收消息的能力 使用类似于心跳包的方法进行测试 SocketClient import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStr
socket获取客户端ip例子
https://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html 例子源码来源于上面帖子。稍做修改,将客户端地址获取,并转换成字符串打印,找了一圈。没有找到靠谱例子~~ #include #include #include #include #include #include #include #define M
Socket 客户端-服务器(C-S)通信实验
学习计算机网络编程也有一段时间了,对这段时间学习的东西做一个小总结吧,主要是基于socket,实现客户端和服务器的通信,编程用java语言。具体的实验要求如下: 设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。 服务端程序能响应单个或任意多个客户端连接请求;服务端能向单个客
socket的客户端和服务端的编程举例
socket 服务器端和客户端通信,面向TCP的 服务器端步骤: 1、创建用于监听的套接字(socket) 2、将套接字绑定到本地地址和端口上(bind) 3、将套接字设为监听模式(listen) 4、等待客户请求(accept),此处要不断的调用accept 5、通信(send/receive),完成后返回4 6、关闭套接字(closesocket)   客户端步骤: 1、创
服务器和客户端显示的端口号不同
问题描述:redis客户端连接redis服务器之后,发现客户端和服务其显示的端口号不同。如图:服务器日志:Accepted 127.0.0.1:62149    显示客户端的信息客户端日志:redis 127.0.0.1:6379   显示服务器的信息解释:服务端和客户端处于同一台主机,所以IP是相同的,不同的Port是用来区分主机上不同的应用程序。IP确定哪一台主机Port确定主机上的哪一个应用...
Java中利用socket实现简单的服务端与客户端的通信(基础级)
在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程。上一篇文章的链接:Java中利用socket实现简单的服务端与客户端的通信(入门级) 这次,我们将上一节中的代码进行少许的更改,将服务器更改为多线程,使得服务器可以为多个客户端服务。 因为是服务器端实现的多线程,所以客户端的代码不用做任何更改,
socket编程之---------获取客户端主机名和IP地址
TCP 服务器端:package com.wodwl.example;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class GetSocketInfo { public static void main
Java Socket 客户端与服务器端的简单交互
一直想了解客户端与服务器之间的底层的一些交互 我刚开始看到关于解析header的一些例子,但是不清楚是客户端呢还是服务器端 后来,我发现,我的想法是有问题的,解析header只是例子的一个体现方式。 客户端 request 服务器 response  不管哪个都有头部信息,所以重点不是在这里。 服务器端是监听某个端口是否有客户端对其进行连接,socket就像是一个管道,client