我试图创建一个简单的java程序,客户端和服务器都能够发送并获取字符串和整数。我只能使用字符串或仅使用整数来完成它但我发现很难将它们组合起来而不会弄得一团糟。如果有人能告诉我最简单的方法,我会感激不尽。这是我到目前为止所做的事情,但它给出了错误的数字。
MyServer.java
package myserver;
import java.io.DataInputStream;
import java.util.Random;
import java.io.*;
import java.net.*;
public class MyServer
{
public static void main(String argv[]) throws Exception
{
String clientSentence;
String answer;
ServerSocket welcomeSocket = new ServerSocket(6789);
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
Random rand = new Random();
int n = rand.nextInt(100) + 1;
System.out.println("Received: " + clientSentence);
answer = "Hey " + clientSentence + " guess a number from 1 to 100!" + '\n';
outToClient.writeBytes(answer);
DataInputStream integerFromClient = new DataInputStream(connectionSocket.getInputStream());
int k = integerFromClient.readInt();
System.out.println(k);
}
}
MyClient.java
package myserver;
import java.io.*;
import java.net.*;
class MyClient
{
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("SERVER: " + modifiedSentence);
int k = inFromUser.read();
outToServer.writeInt(k);
clientSocket.close();
}
}
答案 0 :(得分:1)
我建议你使用围绕BufferedInputStream / BufferedOutputStream的DataInputStream / DataOutputStream。这将允许您发送
dos.writeUTF(string);
String s = dis.readUTF();
或
dos.writeInt(n);
int i = dis.readInt();
如果你不知道你要去哪种类型,你可以使用这样的字节。
dos.writeByte('S');
dos.writeUTF(string);
dos.writeByte('i');
dos.writeInt(n);
和
for(int code; (code = dis.read()) != -1;) {
switch(code) {
case 'S':
String s = dis.readUTF();
process(s);
break;
case 'i':
int i = dis.readInt();
process(i);
break;
default:
throw new StreamCorruptedException("code: "+code);
}
}
您可以将其扩展为发送复杂的数据结构。
答案 1 :(得分:0)
在这种情况下,“混乱”只是您的消息结构。您正在通过套接字发送原始值而没有关于值的信息,这使得收件人很难确定该值可能是什么数据。我想这是主要问题。
我建议您选择一种预先存在的格式,以便将数据类型合并为一条消息。我建议使用JSON或xml,它们可以非常容易地使用相应的库进行编组。
否则,您可以查看更简单的内容,例如bencoding structure,将int 3和字符串“hello”组合成一条消息将如下所示:
i3e5:hello