两个在各自局域网的用户,分别用各自的路由器代理上网。他们间的单独通讯可以用点对点的方式。比方说QQ,我知道这样方式可以用UDP方式实现。不知道能不能用TCP方式实现。就是说,在一个局域网内的机器上开了一个ServerSocket,另外一个用户能不能用Socket访问到这个ServerSocket.

解决方案 »

  1.   

    TCP就是慢点吧,肯定是不如UDP快了。不过实现应该可以实现的。
      

  2.   

    可以阿 我还用过socket连接到一个大网站呢
      

  3.   

    to  Mervyn(御剑乘风来,除魔天地间。)  能不能详细一点。怎么实现
      

  4.   

    if there is a firewall exists, your connection would be blocked, use relay server to keep a pair of persistent connections
      

  5.   

    // UDPimport java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.*;
    import java.io.IOException;public class ChatDemo extends JFrame {
    private JTextField tfIP,tfMessage;
    private List display;
    DatagramSocket ds = null;
    DatagramPacket dp = null;

    public ChatDemo(){

    super("聊天程序");

    //set up GUI
    JPanel southPanel= new JPanel();
    southPanel.setLayout(new BorderLayout());
    tfIP = new JTextField(10);
    tfMessage = new JTextField(15);


    southPanel.add(tfIP,BorderLayout.WEST);
    southPanel.add(tfMessage,BorderLayout.EAST);

    display = new List();
    //display.setVisibleRowCount(10);

    getContentPane().add(display,BorderLayout.CENTER);
    getContentPane().add(southPanel,BorderLayout.SOUTH);

    try{
    ds = new DatagramSocket(3000);
    }
    catch(SocketException e){

    e.printStackTrace();
    }

    new Thread(

    new Runnable(){

    public void run(){

    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf,1024);

    while(true){
    try{
    ds.receive(dp);
    display.add(new String(buf,0,dp.getLength())+"\n\n From:"+dp.getAddress().getHostAddress()+":"+
    dp.getPort());
    }
    catch(IOException e){

    if(!ds.isClosed())
    e.printStackTrace();
    }
    }
    }
    }
    ).start();

    tfMessage.addActionListener(

    new ActionListener(){

    public void actionPerformed(ActionEvent event){

    try{
    dp = new DatagramPacket(tfMessage.getText().getBytes(),tfMessage.getText().getBytes().length,
    InetAddress.getByName(tfIP.getText()),3000);
    ds.send(dp);

    tfMessage.setText("");
    }
    catch(IOException e){

    e.printStackTrace();
    }
    }
    }
    );

    addWindowListener(

    new WindowAdapter(){

    public void windowClosing(WindowEvent event){

    ds.close();
    dispose();
    System.exit(0);
    }
    }
    );

    setSize(300,400);
    setVisible(true);
    setResizable(false);
    }

    public static void main(String[] args){

    ChatDemo application = new ChatDemo();
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
    // TCPimport java.net.*;
    import java.io.IOException;
    public class TCPServerDemo {
    static int count=0;
    static boolean bRunning = true;
    public static void main(String[] args){

    try{
    ServerSocket ss = new ServerSocket(8003);

    //boolean bRunning = true;

    while(bRunning){

    Socket s = ss.accept();
    if(s!=null)
    count++;
    new Thread( new Servicer(s)).start();
    }

    ss.close();
    }
    catch(IOException e){

    e.printStackTrace();
    }
    }
    }//=========================================================import java.net.*;
    import java.io.*;public class TCPServer {

    public static void main(String[] args){

    try{
    ServerSocket ss = new ServerSocket(8003);
    Socket s = ss.accept();

    InputStream ips = s.getInputStream();
    OutputStream ops = s.getOutputStream();

    ops.write("Hello World".getBytes());

    BufferedReader bf = new BufferedReader(new InputStreamReader(ips));

    System.out.println(bf.readLine());

    bf.close();
    ops.close();
    s.close();
    ss.close();
    }
    catch(IOException e)
    {
    e.printStackTrace();
    }
    }
    }
    //===========================================================import java.net.*;
    import java.io.*;public class Servicer implements Runnable {
    private Socket s;

    public Servicer(Socket s){

    this.s = s;
    }

    public void run(){

    try{
    InputStream ips = s.getInputStream();
    OutputStream ops = s.getOutputStream();

    BufferedReader br = new BufferedReader( new InputStreamReader(ips));
    PrintWriter pw = new PrintWriter(ops,true);
    while(true){

    String strLine = br.readLine();

    if(strLine.equalsIgnoreCase("quit")){

    TCPServerDemo.count--;
    if(TCPServerDemo.count==0)
    TCPServerDemo.bRunning = false;
    break;
    }
    System.out.println(strLine+"From"+s.getInetAddress().toString()+":"+s.getPort());
    String strEcho = (new StringBuffer(strLine).reverse()).toString();
    pw.println(strLine +"------>"+strEcho);
    }

    br.close();
    pw.close();

    s.close();
    }
    catch(IOException e){
     
    e.printStackTrace();
    }
    }
    }