漂亮,我一直想找NAT穿透的代码看看。

解决方案 »

  1.   

    有我们欣赏就行了,哪里有那么多知己啊,呵呵socket网络编程能达到这个境界的不多的,老兄听牛的,佩服
      

  2.   

    没有楼上的楼上的说那么夸张
    只不过是服务器对tcp连接的管理和转发而已
      

  3.   

    不通过服务器,直接打洞,楼主可以实现吗?
    tcp,udp 哪个实现都行
      

  4.   

    楼主有些不知道自己水平...
    我大幅度修改了楼主的代码,希望不犯法...
    原来的程序连个buffer都没有,芬特
    package test;import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Iterator;
    import java.util.Vector;public class TcpTracts extends Thread {    private final int port;    public TcpTracts(int port) {
            super();
            this.port = port;
        }    public void run() {
            ServerSocket socket = null;
            Socket client = null;
            try {
                socket = new ServerSocket(port);
                System.out.println("listening: " + socket.getLocalPort());
                while (true) {
                    client = socket.accept();
                    System.out.println(client);
                    new ConnectionThread(client).start();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }    public static void main(String args[]) {
            TcpTracts tt = new TcpTracts(8080);
            tt.start();
        }
    }class ConnectionThread extends Thread {
        Socket socket;    private final String FORMATERROR = "format error";    private final String req = "req";    private final String res = "res";    private int trackIndex;    public ConnectionThread(Socket socket) {
            this.socket = socket;
        }    public void run() {
            try {
                DataOutputStream out = new DataOutputStream(socket
                        .getOutputStream());
                DataInputStream in = new DataInputStream(socket.getInputStream());
                String inline = in.readUTF();            if (inline.equals(req)) {
                    trackIndex = getChannels().size();
                    getChannels().add(new Vector());
                    out.writeUTF(res + trackIndex);
                } else if (inline.startsWith(res)) {
                    trackIndex = Integer.parseInt(inline.substring(res.length()));
                    out.writeUTF(res + trackIndex);
                } else {
                    return;
                }            Vector vouts = (Vector) getChannels().get(trackIndex);            socket.setSoTimeout(3000);
                vouts.add(out);            byte[] buff = new byte[2048];
                int flag = 0;            try {
                    while ((flag = in.read(buff)) > 0) {
                        Iterator it = vouts.iterator();
                        while (it.hasNext()) {
                            DataOutputStream out2 = (DataOutputStream) it.next();
                            if (!out2.equals(out)) {
                                out2.write(buff, 0, flag);
                            }
                        }
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    vouts.remove(out);
                    if (vouts.size() == 0) {
                        getChannels().remove(trackIndex);
                    }
                    out = null;
                    in = null;
                }
                socket.close();
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }    private static Vector getChannels() {
            return channels == null ? channels = new Vector() : channels;
        }    private static Vector channels;
    }
      

  5.   

    楼上的感谢你的删改我考虑的也不是很周全,不过没有buff的原因我是考虑了传输的实时性,可能多虑了
    如果读buffer我用telnet做实验的时候,常常会读到一些无用的字符
      

  6.   

    推荐用http协议或类http协议实现

    XXXXX
    XXXXXXXXXX
    以第一个空行分隔控制信息和bin信息
      

  7.   

    好,正好学习,我现在想做一个web程序与后台7*24小时程序的会话机制,以便能在web上对后台进行动态管理,但是不用jmx
      

  8.   

    请教  lxleaves(飘泊的叶子) http实现如何做到主动push,能讲一下思路吗?
      

  9.   

    我只是说参照http协议的分割方法
    还有,如果你是想用http的主动push,这需要客户端和服务端配合才行呀
    既然你的实现是cs模式,那么就按你原来的思路实现嘛