通过服务器,解决两个NAT内建立TCP连接的一段代码 漂亮,我一直想找NAT穿透的代码看看。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有我们欣赏就行了,哪里有那么多知己啊,呵呵socket网络编程能达到这个境界的不多的,老兄听牛的,佩服 没有楼上的楼上的说那么夸张只不过是服务器对tcp连接的管理和转发而已 不通过服务器,直接打洞,楼主可以实现吗?tcp,udp 哪个实现都行 楼主有些不知道自己水平...我大幅度修改了楼主的代码,希望不犯法...原来的程序连个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;} 楼上的感谢你的删改我考虑的也不是很周全,不过没有buff的原因我是考虑了传输的实时性,可能多虑了如果读buffer我用telnet做实验的时候,常常会读到一些无用的字符 推荐用http协议或类http协议实现如XXXXXXXXXXXXXXX以第一个空行分隔控制信息和bin信息 好,正好学习,我现在想做一个web程序与后台7*24小时程序的会话机制,以便能在web上对后台进行动态管理,但是不用jmx 请教 lxleaves(飘泊的叶子) http实现如何做到主动push,能讲一下思路吗? 我只是说参照http协议的分割方法还有,如果你是想用http的主动push,这需要客户端和服务端配合才行呀既然你的实现是cs模式,那么就按你原来的思路实现嘛 两道测试题,请高手指点 table显示不了第一行 Java连接数据库 关于遍历ResultSet的效率 字符数组转化为字符串用什么函数呢? 有个简单问题请各位大哥帮忙, IOException类里面的 fillInStackTrace,getStackTrace,printStackTrace(光这个就三种),setStackTrace分别都能实现什么功能?(我真的查 JAXB读写XML问题 想知道sohu的java聊天室是如何做的! Applet中文字方向问题 号召大家一起做个btchina的客户端,感兴趣的进! 在jtree中我重写了类TreeNode,怎么调用这个类
只不过是服务器对tcp连接的管理和转发而已
tcp,udp 哪个实现都行
我大幅度修改了楼主的代码,希望不犯法...
原来的程序连个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;
}
如果读buffer我用telnet做实验的时候,常常会读到一些无用的字符
如
XXXXX
XXXXXXXXXX
以第一个空行分隔控制信息和bin信息
还有,如果你是想用http的主动push,这需要客户端和服务端配合才行呀
既然你的实现是cs模式,那么就按你原来的思路实现嘛