[英]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.