java中用Socket向ServerSocket发送信息,ServerSocket用接收到的Socket返回一条信息,但是返回时报错...
发布网友
发布时间:2022-04-13 21:52
我来回答
共4个回答
热心网友
时间:2022-04-13 23:21
static int SERVERPORT=12345;
public static void main(String[] args) throws Exception {
boolean flag = true;
ServerSocket server = new ServerSocket(SERVERPORT);
while(flag) {
Socket s = server.accept();
DataInputStream in = new DataInputStream(s.getInputStream());
String str = in.readUTF();
System.out.println(str);
DataOutputStream out = new DataOutputStream(s.getOutputStream());
String msg = "hello client";
out.writeUTF(msg);
out.flush();
s.close();
}
}
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", SERVERPORT);
DataOutputStream out = new DataOutputStream(s.getOutputStream());
String msg = "hello server";
out.writeUTF(msg);
out.flush();
DataInputStream in = new DataInputStream(s.getInputStream());
String str = in.readUTF();
System.out.println(str);
s.close();
}
注意:流不能关闭,调用流的close方法会导致socket关闭
追问谢谢你!能不能改成基础流InputStream和OutputStream,因为我们要处理byte数组,我之前改的用基础流的没有关闭流也是用flush()但还是不行
追答程序还是你自己写,就当是练手吧。
不要用read()==-1来判断是否结束,而改用先写要写出的byte[]的长度,接收时先读长度,然后再用read(byte[] b, int off, int len)读,直到读满长度为止
热心网友
时间:2022-04-14 00:39
while((t=in.read()) != -1) { <--改为 t=in.read(bytes) bytes[i] = (byte)t;
i++; }t的结果你独到的字节的个数 ,不是具体的值,具体的值已经保存到字节数组里面去了
应该这样
str += new String(bytes); 这样可以独到每一个具体的值
另外,你把out.close() 改成 out.flush() 你再测试下结果
热心网友
时间:2022-04-14 02:14
你 服务器端写完之后就关闭了,所以会包socket is closed.
热心网友
时间:2022-04-14 04:05
while((t=in.read()) != -1) { bytes[i] = (byte)t; i++; } String str = new String(bytes); System.out.println(str);
改为
while((i=in.read(bytes))!=-1){
System.out.print(new String(bytes,0,1))
}追问客户端和服务器的读操作都这么写么?这句--System.out.print(new String(bytes,0,1))--什么意思?循环变量 i 和每次循环取得的 t 都没有意义了,麻烦详解下整个循环到底怎么写?