java网络编程的疑问

有一个问题请教一下,
服务器端的ServerSocket接收数据的时候,
当accept一个客户端的连接,
然后开一个线程来接收数据,然后继续accept。
就在第一个客户端数据还没传完的时候又有一个客户端来连接了,
那么第二个客户端是在同一时间用同一个端口来接收数据的,
会有问题吗?为什么呢?
ps:如果没有问题的话,怎么知道在某一个时刻传来的数据是给第一个线程还是给第二个线程呢,后台是不是有个监控程序呢?
谢谢

[code="java"]哦,那么怎么知道在某一个时刻传来的数据是给第一个线程还是给第二个线程呢,java的后台是不是有个监控程序呢?[/code]

[size=large][color=red]看来我给你刚才写的程序,你是没看或者没仔细看.或者没看明白吧...白费我的苦心了哦...

你如果能明明白理解我刚才写的那两个程序,我想你就不会再有什么问题了.

建议你最好找书好好看看TCP Socket编程模型吧...[/color][/size]

[quote]就在第一个客户端数据还没传完的时候又有一个客户端来连接了,
那么第二个客户端是在同一时间用同一个端口来接收数据的,
会有问题吗?为什么呢? [/quote]

[size=large][color=red]不会用同一个端口来和两个客户端来通信,从理论上讲也是讲不通的.如果用同一个端口和两个客户端通信,那要给其中一个客户端发信息时,怎么通过同一个端口来指定呢?[/color][/size]

[size=x-large][color=violet]希望对你有所帮助...[/color][/size]

Server的代码(JDK1.5运行OK):
[code="java"]
package com.Test;

import java.net.ServerSocket;
import java.net.Socket;

/*

  • created time:下午09:57:45
  • creator: Tian Zhichao (chinoistzc@gmail.com)
    *
    */
    public class Server {

    /**

    • main() 2010-4-11,下午09:57:46 */ public static void main(String[] args) { // TODO Auto-generated method stub try { ServerSocket server = new ServerSocket(8888); while(true){ Socket client = server.accept(); new ManipulateClient(client).start(); } } catch (Exception e) { e.printStackTrace(); } } public void run(){

    }

}
class ManipulateClient extends Thread{
private Socket socket;
public ManipulateClient(Socket _socket){
this.socket = _socket;
}
public void run(){
System.out.println(socket.getRemoteSocketAddress());
}
}

[/code]
Client的代码:
[code="java"]package com.Test;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;

/*

  • created time:下午10:01:47
  • creator: Tian Zhichao (chinoistzc@gmail.com)
    *
    */
    public class Client {

    /**

    • main() 2010-4-11,下午10:01:47
      */
      public static void main(String[] args) {
      // TODO Auto-generated method stub
      try {
      Socket client = new Socket("127.0.0.1",8888);
      OutputStream os = client.getOutputStream();
      DataOutputStream dos = new DataOutputStream(os);
      dos.writeUTF("aaaa");

      } catch (Exception e) {
      e.printStackTrace();
      }
      }

}
[/code]
[size=x-large][color=red]希望对你有所帮助...[/color][/size]

[quote]你好,你的程序也是使用的8888这个端口来接收数据的,当你的本地的客户端正在写数据到服务器端的时候,这时又有其他机器的客户端来连服务器,那么服务器会同时接收这两个客户端的数据吗?[/quote]

[size=x-large][color=red]
服务器是可以同时接收N个客户端的.每个客户端用一个线程来接收就可以了.

就像现在的QQ,你以为你一个号码,人家给你一台机器在服务你的QQ哇?[/color][/size]

每次Accept得到的socket对象都是一个新的对象,在传统的io网络框架里面,你需要针对每个socket对象来起一个单独的线程处理。
比如:
[code="java"]
final Socket cs = server.accept();
Thread th = new Thread(){
public void run(){
while(true){
//从客户那里读取数据
//处理数据
}

 }

};
[/code]

我这里为了简便,直接使用了内部类的方式,你可以另外写runnable接口或者从Thread继承。

网络协议里面通过客户ip和端口来区分不同的链接