看到一段代码如下:
package com.googlecode.garbagecan.test.socket.sample2;  
  
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
public class MyServer {  
    public static void main(String[] args) throws IOException {  
        ServerSocket server = new ServerSocket(10000);  
          
        while (true) {  
            Socket socket = server.accept();  
            invoke(socket);  
        }  
    }  
      
    private static void invoke(final Socket client) throws IOException {  
        new Thread(new Runnable() {  
            public void run() {  
                BufferedReader in = null;  
                PrintWriter out = null;  
                try {  
                    in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
                    out = new PrintWriter(client.getOutputStream());  
  
                    while (true) {  
                        String msg = in.readLine();  
                        System.out.println(msg);  
                        out.println("Server received " + msg);  
                        out.flush();  
                        if (msg.equals("bye")) {  
                            break;  
                        }  
                    }  
                } catch(IOException ex) {  
                    ex.printStackTrace();  
                } finally {  
                    try {  
                        in.close();  
                    } catch (Exception e) {}  
                    try {  
                        out.close();  
                    } catch (Exception e) {}  
                    try {  
                        client.close();  
                    } catch (Exception e) {}  
                }  
            }  
        }).start();  
    }  
}  
下面是Client程序代码:
[java] view plaincopyprint?
package com.googlecode.garbagecan.test.socket.sample2;  
  
import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.net.Socket;  
  
public class MyClient {  
    public static void main(String[] args) throws Exception {  
        Socket socket = new Socket("localhost", 10000);  
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
        PrintWriter out = new PrintWriter(socket.getOutputStream());  
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));  
  
        while (true) {  
            String msg = reader.readLine();  
            out.println(msg);  
            out.flush();  
            if (msg.equals("bye")) {  
                break;  
            }  
            System.out.println(in.readLine());  
        }  
        socket.close();  
    }  
}  
如上是多线程通信的实例。但是我对socket还是有不懂的地方。
比如socket对象是如何共用一个端口号的?当服务器监听到一个socket对象,new一个新线程,是以发数据包过来的client的ip为标识吗?还是包含了其他标识,比如client程序的端口号?
我想知道同一个ip执行两个client程序,服务器程序会不会当成一个socket,而不新建线程?还是当client执行第二个client程序后再new一个线程?
socket网络

解决方案 »

  1.   

    每个socket都用的不同的端口号,你代码里的那个10000是服务器端的监听端口,而不是工作链接的端口client里的这行
    Socket socket = new Socket("localhost", 10000);
    这里的localhost以及10000指的是服务器端的地址和监听端口(这里用了localhost,说明server和client是同一台机器)。client的local 端口会自动分配一个未占用的。而服务器端收到TCP链接请求后,也会自动分配一个服务器端的端口,所以新建立的socket的两端的端口都不是10000。
    新建立的socket的remote以及local端口可以通过getLocalPort() 以及getPort()查到 并且,新建socket不会新建线程,线程需要你自己建立,然后把新建的socket的引用传过去
      

  2.   


    也就是说,实际上每当监听到一个请求,服务器就会新分配一个端口号与Client对话吗?