聊天室案例V2.
改善聊天室案例V1,实现客户端重复发送数据到服务器端的功能,即用户可以在控制台不断
输入内容,并将内容逐一发送给服务端
1.对于客户而言,为了能够重复发送,需要构建循环,并在循环中,不断读入控制台录入的数据
并发送
2.对于服务器端,也需要构建循环,并在循环中不断读取客户端发来的数据并打印显示.
TCP通信
Server端多线程的应用
.若想使一个服务端可以支持多客户端连接,我们需要解决一下问题
-1.循环调用accept方法侦听客户端的连接
-2.使用线程来处理单一客户端的数据交互
因为需要处理多客户端,所以服务端要周期性循环调用accept方法,但该方法会产生阻塞,所
以要与某个客户端的交互就需要使用线程来并发处理
public class Client2 {
private Socket socket;
public Client2() {
try {
socket = new Socket("localhost", 8060);
}catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
PrintWriter pw = new PrintWriter(osw,true);
Scanner scanner = new Scanner(System.in);
while(true) {
pw.println(scanner.nextLine());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Client2 c2 = new Client2();
c2.start();
}
}
public class Server2 {
private ServerSocket serversocket;
public Server2() {
try {
serversocket = new ServerSocket(8060);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("Wait Client Connect");
try {
Socket socket = serversocket.accept();
System.out.println("Successful connection to client");
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
while(true) {
System.out.println("Client Speak:"+br.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server2 s2 = new Server2();
s2.start();
}
}