我有一个C ++服务器和两个客户端(红宝石和Java)。一切都在64位linux机器(java

1.7.0_17)上运行。ruby客户端可以正常工作,但是java版本会出现问题。

在Java中,我尝试将字符串从客户端发送到服务器。实际上,服务器收到了整个字符串,但是服务器认为还有更多东西要接收。

红宝石客户端看起来像这样:

socket = TCPSocket.open(@options[:host],@options[:port])

test = "Hello, World"

socket.puts test

socket.shutdown 1

response = socket.gets

这里的一切工作正常。红宝石客户端发送一个字符串。服务器接收该字符串并发送答复。

Java版本如下所示:

String ip = "127.0.0.1";

int port = 6686;

java.net.Socket socket = new java.net.Socket(ip,port);

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());

InputStreamReader in = new InputStreamReader(socket.getInputStream());

String msg = "Hello, world!";

//send

PrintWriter pw = new PrintWriter(out, true);

pw.print(msg);

pw.flush();

// I also tried: out.write(msg); out.flush(); nothing changed

//receive the reply

BufferedReader br = new BufferedReader(in);

char[] buffer = new char[300];

int count = br.read(buffer, 0, 300);

String reply = new String(buffer, 0, count);

System.out.println(reply);

socket.close();

另一方面,有一台C ++服务器:

string receive(int SocketFD) {

char buffer[SOCKET_BUFFER_SIZE];

int recv_count;

// empty messagestring

string message = "";

// empty buffer

memset(buffer, 0, sizeof(buffer));

while ((recv_count = recv(SocketFD, buffer, sizeof(buffer) - 1, 0)) > 0) {

/*if (recv_count == -1) {

cout << "failed." << endl;

break;

}*/

cout << recv_count << endl;

if (ECHO_SOCKETS) cout << "received: " << buffer << endl;

message.append(buffer);

memset(buffer, 0, sizeof(buffer));

if (ECHO_SOCKETS) cout << "message is now: " << message << endl;

}

return message;

}

Java消息的服务器输出是:

13

received: Hello, world!

message is now: Hello, world!

然后什么也没有发生。问题是:

recv(SocketFD, buffer, sizeof(buffer) - 1, 0)

陷入无限循环(或类似的循环)中。如果我杀死了Java客户端进程,或者输入了类似的内容:

pw.print(msg);

out.close();

服务器端的输出是:

_sending reply: "Request unrecognized/invalid" request="Hello, world!"

send reply success

now close connection

此输出是正确的(“发送答复成功”除外),但是在添加的情况下:

out.close();

客户端无法收到服务器的回复。因为套接字是关闭的。

java.net.SocketException: Socket is closed

at java.net.Socket.getInputStream(Socket.java:864)

at MyServer.writeMessage(MyServer.java:56)

at MyServer.test(MyServer.java:42)

at MyServer.main(MyServer.java:30)

编辑

我试图调用pw.flush(); 以及不同的定界符,例如“ \ n”,“ \ r”,“ \ r \ n”和“ \ n \

r”,但服务器仍然认为仍然需要读取一些内容。我也尝试使用DatagramSockets:

java.net.DatagramSocket dSocket = new java.net.DatagramSocket();

InetAddress address = InetAddress.getByName("localhost");

String msg = "Hello, world!";

byte[] buf = msg.getBytes();

java.net.DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 6686);

但是服务器无法接受该数据包。

ruby-client做类似socket.shutdownOutput();的事情。(红宝石:socket.shutdown

1)在看跌期权调用之后。我更改了java-client-code:

out.write(msg);

socket.shutdownOutput();

而且有效!

正如@Charly所说:我必须定义一个“协议”。就我而言,我不允许更改任何与通信相关的代码(在服务器和ruby客户端中),因为另一组研究人员使用了此功能。所以我修改这样我的Java客户端,它确实的

确切 同样的事情在 精确的 同时红宝石客户端(如协议的东西)。

服务器java 客户端c_Java客户端和C ++服务器通过TCP套接字发送和接收相关推荐

  1. java发送和接收文件_Java通过套接字发送和接收文件(byte [])

    这是服务器 打开文件流并将其发送到网络 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInpu ...

  2. 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

    TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...

  3. Java网络编程之UDP和TCP套接字

    文章目录 一. 网络编程概述 二. UDP网络编程 1. UDP套接字 2. UDP客户端回显服务器程序 2.1 UDP回显服务器 2.2 UDP客户端 2.3 UDP实现查词典的服务器 三. TCP ...

  4. java上传视频文件到服务器,java视频上传到远程服务器

    java视频上传到远程服务器 内容精选 换一换 该步骤必须在root用户下执行,若以普通系统用户登录,需要执行su切换到root用户下执行后续操作.ssh-keygen -t rsa过程中需要:(可选 ...

  5. java上传文件到服务器,java上传文件到云服务器

    java上传文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装 ...

  6. java文件上传到云服务器,java文件上传到云服务器

    java文件上传到云服务器 内容精选 换一换 当用户拥有Linux操作系统的外部镜像文件,且类型及操作系统符合外部镜像文件格式和操作系统类型要求时,用户可以将外部镜像文件创建为Linux系统盘镜像. ...

  7. python TCP套接字服务器v1.1-新增服务端命令功能及修改bug(socket+PyQt5)

    TCP聊天服务器套接字v1.1 所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread(含日志,html)+anaco ...

  8. 造成Java连接超时的原因,是什么原因导致套接字ConnectException:连接超时?

    我们有一个Webstart客户端,它通过使用HTTPS通过HTTPS发送序列化对象来与服务器通信java.net.HttpsURLConnection. 在本地计算机和办公室中的测试服务器上,一切都可 ...

  9. eclipse写java实现端口_使用eclipse(windows)在java中使用IPv6地址和端口号创建套接字...

    当我尝试使用IPv4地址创建套接字时,它很成功,但是当我尝试使用IPv6地址和端口号创建套接字时,它会引发异常: java.net.SocketException: Network is unreac ...

最新文章

  1. c++函数overload 的歧义匹配
  2. ActFramework 小贴士 - 获得应用版本
  3. VTK:Rendering之StringToImageDemo
  4. opencv多线程显示的问题和解决方法
  5. 变量在内存中的值[c][code]
  6. Easyexcel异常处理:getOutputStream() has already been called for this response
  7. 好用的下拉第三方——nicespinner
  8. matlab中size(A 2),MATLAB中size(A,2)什么意思
  9. Java最全思维导图知识汇总
  10. 深入浅出MFC-侯俊杰
  11. Atitit r2017 r4 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati ext\r2017
  12. docker搭建文档管理服务器,Docker中文文档
  13. 高中计算机课听课记录表,初中信息技术课听课记录中学信息技术评课笔记
  14. OceanBase 安装-采用OCP安装
  15. 51Ditu开放了地图服务API接口
  16. c语言 lis的nlogn算法,LCS (nlogn)
  17. win10 hao123劫持html文件,Win10 edge浏览器主页被hao123劫持怎么解决?
  18. 直播平台录播系统架构
  19. 高频强调滤波增强图像
  20. 【stm32】delay详解

热门文章

  1. mysql处理varchar类型的between和and的时间问题少一天解决;
  2. 【干货】2021年技术趋势:全球企业加速数字化转型-德勤.pdf(附下载链接)
  3. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(2)——Encoder stage
  4. 【论文】基于特定实体的文本情感分类总结(PART I)
  5. 基于scikit-learn的SVM实战
  6. 如何快速搭建一个属于自己的网站?
  7. Leetcode每日一题:328.odd-even-linked-list(奇偶链表)
  8. markdown文档中利用Mathpix Snip软件插入公式
  9. 西瓜书+实战+吴恩达机器学习(八)监督学习之朴素贝叶斯 Naive Bayes
  10. Anaconda安装过程中出现InvalidArchiveError