Java Socket 编程的问题

angry_code 2017-09-12 04:12:33
我是想实现,服务端一直在监听客户端的Socket,客户端在标准输入获取一个字符串,然后发送给服务端,当服务端收到后,向客户端返回一个Hello!字符串。
问题:当客户端输入第二条字符串后,按Enter键就没反应,也不可以继续录入。


import java.net.ServerSocket;
import java.net.Socket;
import java.lang.Thread;
import java.io.OutputStream;
import java.io.InputStream;
import java.net.InetAddress;

class ServerSocketTest extends Thread {
public static void main(String[] args) {
if (args.length > 0) {
service();
} else {
client();
}
}

private Socket s;

ServerSocketTest(Socket s) {
this.s = s;
}

public void run() {
try {
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
byte[] b = new byte[100];
int len = is.read(b);
System.out.println(new String(b, 0, len));
os.write("Hello!".getBytes());
//os.close();
//is.close();
//s.close();
} catch (Exception e) {
e.printStackTrace();
}

}

public static void service() {
try {
ServerSocket ss = new ServerSocket(5550);
Socket s;
while (true) {
s=ss.accept();
new ServerSocketTest(s).start();
//ss.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void client() {
try {
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 5550);
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();

byte[] buf = new byte[100];
int data;
int i;
while(true){
i = 0;
while((data = System.in.read())!=13){
buf[i]=(byte)data;
i++;
}
//os.write("Hello!Lee".getBytes());
os.write(buf,0,i);
i = is.read(buf);
System.out.println(new String(buf, 0, i));
}

//os.close();
//is.close();
//s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
...全文
403 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjjk 2017-09-15
  • 打赏
  • 举报
回复
服务端也加个os.flush
sjjk 2017-09-15
  • 打赏
  • 举报
回复
你在Client端调用os.write之后加个os.flush()看看
  • 打赏
  • 举报
回复
每个用户只要连接到服务端就会自动的获取到流,服务端和客户端只要互相发数据就行了。一开始你一直输入也收不到服务端反馈,是因为开启的那个线程在完成一次发送和接收到客户端信息就已经结束了,虽然连接没有断开,但是已经不会发送和接受客户端信息了。 所以只要定义一个循环让它一直去发送和接受数据就没问题了。

import java.net.ServerSocket;
import java.net.Socket;
import java.lang.Thread;
import java.io.OutputStream;
import java.io.InputStream;
import java.net.InetAddress;

class ServerSocketTest extends Thread {
	public static void main(String[] args) {
		if (args.length > 0) {
			service();
		} else {
			client();
		}
	}

	private Socket s;

	ServerSocketTest(Socket s) {
		this.s = s;
	}

	public void run() {
		try {
			System.out.println("开启线程");
			OutputStream os = s.getOutputStream();
			InputStream is = s.getInputStream();
			boolean flag = true;
			while(flag){
				System.out.println("获取到了流");
				byte[] b = new byte[100];
				int len = is.read(b);
				System.out.println(new String(b, 0, len));
				os.write("Hello!".getBytes());
//				len = is.read(b);
//				if("n".equals(new String(b, 0, len)))
//					flag = false;
			}
			os.close();
			is.close();
			s.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static void service() {
		try {
			ServerSocket ss = new ServerSocket(5550);
			Socket s;
			while (true) {
				s=ss.accept();
				new ServerSocketTest(s).start();
				//ss.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void client() {
		try {
			
			byte[] buf = new byte[100];
			int data;
			int i;
			Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 5550);
			OutputStream os = s.getOutputStream();
			InputStream is = s.getInputStream();
			boolean flag = true;
			while(flag){
				i = 0;
				while((data = System.in.read())!=13){
				buf[i]=(byte)data;
				i++;
				}
				//os.write("Hello!Lee".getBytes());
				os.write(buf,0,i);
				i = is.read(buf);
				System.out.println(new String(buf, 0, i));
			}
			os.close();
			is.close();
			s.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
rayw0ng 2017-09-13
  • 打赏
  • 举报
回复
循环的是 accept,接受多个客户端的连接请求。而你的客户端只会发起一次连接请求。
angry_code 2017-09-12
  • 打赏
  • 举报
回复
引用 1 楼 loneking2001 的回复:
因为你的 run 方法只读一次就结束了,然后服务线程就退出了。虽然 service 还可以 accept 新的 client,但是正在运行的 client 对应的服务线程已经没有了。
 while (true) {                 s=ss.accept();                 new ServerSocketTest(s).start();                 //ss.close();             } 这里的代码就想让ss接受到一个Socket,创建一个ServerSocketTest线程,调用run去处理,让他们一直这样循环。
rayw0ng 2017-09-12
  • 打赏
  • 举报
回复
因为你的 run 方法只读一次就结束了,然后服务线程就退出了。虽然 service 还可以 accept 新的 client,但是正在运行的 client 对应的服务线程已经没有了。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧