上次的服务端一次只能跟一个客户端连接。下午决定结合前面学习的线程的知识,更改一下,改成多线程的服务端。
这里只是简单的尝试。等我学的知识增加了,会写出更好的来的。
服务端代码:
- package Socket;
- /**
- * @author Geek_Soledad
- * @creation date 2011-4-24 上午08:22:39
- *
- */
- import java.io.*;
- import java.net.*;
- public class TCPServer implements Runnable{
- ServerSocket ss;
- Socket s;
- public static void main( String[] args) {
- TCPServer tcpServer = new TCPServer();
- try {
- tcpServer.ss = new ServerSocket(10086); // Server start
- while (true) {
- tcpServer.s = tcpServer.ss.accept(); // waiting for connection
- new Thread(tcpServer).start();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- message();
- }
- void message() {
- String name;
- DataInputStream dis;
- try {
- dis = new DataInputStream(s.getInputStream());
- name = dis.readUTF();
- System.out.println(name + "已连接!");
- String is = dis.readUTF();
- while("exit".equalsIgnoreCase(is) == false) {
- System.out.println(name+":"+is);
- is = dis.readUTF();
- }
- dis.close();
- s.close();
- System.out.println(name + "已退出");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
运行客户端时,第一个参数指定了客户端的名字。代码如下:
- package Socket;
- /**
- * @author Geek_Soledad
- * @creation date 2011-4-24 上午08:30:47
- *
- */
- import java.io.*;
- import java.net.*;
- public class TCPClient {
- String name = "noname";
- public static void main( String[] args) {
- TCPClient client = new TCPClient();
- if (args.length>0) {
- client.name = args[0];
- }
- client.connection();
- }
- void connection(){
- try {
- Socket s = new Socket("127.0.0.1", 10086);
- System.out.println("成功连上服务端");
- DataOutputStream dos = new DataOutputStream(
- s.getOutputStream());
- BufferedReader bf = new BufferedReader(
- new InputStreamReader(System.in));
- String words ;
- // 发送出客户端名字
- dos.writeUTF(name);
- // 开始通信
- do {
- words = bf.readLine();
- dos.writeUTF(words);
- } while("exit".equalsIgnoreCase(words) == false);
- s.close();
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- System.out.println("服务器IP错误");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- System.out.println("无法连接主机");
- }
- }
- }
刚才发客户端的代码时,又对它改了一下,把连接部分放到函数connection中。
刚才又尝试了一下,在其中一个客户端退出时有时会出现s.close()被调用,导致另一个客户端断开,不知是什么原因。可能我对多线程还得再学习学习。