[英]Java TCP socket program to send and read [x] bytes array. How to loop, sout and sent correctly
我是 sockets 的新手并编写基本的 Java 客户端到服务器到客户端程序,在这种情况下发送消息的长度outToServer.writeInt(message.length);
和byte[] message = new byte[10];
数组到服务器读取并打印到控制台,然后修改数组中的几个字节,然后将其发送回客户端。 客户端接收数组,读取它并将其打印到控制台。
我的问题是它只打印:
byte array received from server class:
0
0
0
0
0
0
0
0
0
0
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
当它应该打印一些具有不同数字的修改字节时。
我认为 for 循环或接收字节的读取部分存在一些问题。 我应该使用 readFully 还是类似的东西,以及如何正确地循环我想要的值?
非常感谢。
客户:
class TCPClient2 {
public static void main(String argv[])
{
try {
System.out.println("Client started");
Socket clientSocket = new Socket("localhost", 8080);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
System.out.println("\nByte array printed before sending to server:\n");
byte[] message = new byte[10];
//byte[] message = new byte[] { -1, -128, 1, 127, 23, 23, 23, 23, 23, 10 }; // you can try these too
message[0] = 1; // changes the first byte of the array
for(int i = 0; i < message.length; i++) {
System.out.println(message[i]); //prints byte array BEFORE being sent to server
}
System.out.println(Arrays.toString(message)); //prints byte array BEFORE being sent to server as String
System.out.println("\n");
outToServer.writeInt(message.length); // write length of the message
outToServer.write(message); // write the message
//
//
// Message -array is now sent to Server
//
// Waiting for answer
//
// Answer is now received from Server
System.out.println("byte array received from server class: \n");
DataInputStream inFromClient = new DataInputStream(clientSocket.getInputStream());
int length = inFromClient.readInt(); // read length of incoming message
/*
if(length>0) {
byte[] message = new byte[length];
dIn.readFully(message, 0, message.length); // read the message
}
*/
byte[] messageFromServer = new byte[length];
for(int i = 0; i < messageFromServer.length; i++) {
System.out.println(messageFromServer[i]);//prints received byte array
}
System.out.println(Arrays.toString(messageFromServer));//prints received byte array as a string
}catch (Exception e) {
e.printStackTrace();
}
}
}
服务器:
class TCPServer2 {
public static void main(String argv[])
{
try
{
System.out.println("waiting for connections");
ServerSocket welcomeSocket = new ServerSocket(8080);
Socket connectionSocket = welcomeSocket.accept();
System.out.println("connection established");
DataInputStream inFromClient =
new DataInputStream(connectionSocket.getInputStream()); //receive byte array from client
int length = inFromClient.readInt(); // read length of incoming message
/*
if(length>0) {
byte[] message = new byte[length];
inFromClient.readFully(message, 0, message.length); // readFully the message, but how?
}
*/
byte[]message = new byte[length];
for(int i = 0; i < message.length; i++) {
System.out.println(message[i]); // print array
}
System.out.println(Arrays.toString(message)); // print array as string
System.out.println("message from client printed");
message[0]= 1; //change bytes of the received array
message[9]=1; //change bytes of the received array
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream()); //send byte array with changes back to the client
outToClient.writeInt(message.length); // write length of the message
outToClient.write(message); // write the message
System.out.println("message to client sent");
} catch (Exception e) {
e.printStackTrace();
}
}
}
问题是您没有从套接字读取数据,而只是在本地数组中循环。
您需要更改这些代码:
1) 服务器
从:
byte[]message = new byte[length];
for(int i = 0; i < message.length; i++) {
System.out.println(message[i]); // print array
}
至:
byte[]message = new byte[length];
for(int i = 0; i < message.length; i++) {
message[i] = inFromClient.readByte();
System.out.println(message[i]); // print array
}
2) 客户端
从:
byte[] messageFromServer = new byte[length];
for(int i = 0; i < messageFromServer.length; i++) {
System.out.println(messageFromServer[i]);//prints received byte array
}
至:
byte[] messageFromServer = new byte[length];
for(int i = 0; i < messageFromServer.length; i++) {
messageFromServer[i] = inFromClient.readByte();
System.out.println(messageFromServer[i]);//prints received byte array
}
一个例子是没有指定控件,数组的长度,......
或与您的 function 一起阅读完全
1) 服务器
int length = inFromClient.readInt(); // read length of incoming message
byte[] message = new byte[length];
if (length > 0) {
inFromClient.readFully(message, 0, message.length); // readFully the message, but how?
}
for (int i = 0; i < message.length; i++) {
System.out.println(message[i]); // print array
}
2) 客户端
int length = inFromClient.readInt(); // read length of incoming message
byte[] messageFromServer = new byte[length];
if (length > 0) {
inFromClient.readFully(messageFromServer, 0, messageFromServer.length); // read the message
}
for (int i = 0; i < messageFromServer.length; i++) {
System.out.println(messageFromServer[i]);//prints received byte array
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.