java socket客户端和Python socket客户端的不同?-问答-阿里云开发者社区-阿里云

开发者社区> 蛮大人123> 正文

java socket客户端和Python socket客户端的不同?

2016-06-13 11:50:24 4019 1

我们接的项目有一个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()

有人能告诉我到底是哪里不同吗?

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 19:35:34

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

    0 0
相关问答

40

回答

[@徐雷frank][¥20]什么是JAVA的平台无关性

大河人家 2018-10-29 23:55:20 144284浏览量 回答数 40

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 223015浏览量 回答数 162

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 333885浏览量 回答数 8

110

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 292302浏览量 回答数 110

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146795浏览量 回答数 22

18

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 643149浏览量 回答数 18

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 145636浏览量 回答数 31

38

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 256878浏览量 回答数 38

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 302612浏览量 回答数 249

24

回答

【精品问答】python技术1000问(1)

问问小秘 2019-11-15 13:25:00 471462浏览量 回答数 24
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载