TcpTracts( 利用服务器,用于两个或多个私网之间建立tcp连接,可以用于发文件,传语音等 )
来源:互联网 发布:广州网络教育招生 编辑:程序博客网 时间:2024/04/30 15:17
package nj.jyz;
import java.io.*;
import java.net.*;
import java.util.*;
public class TcpTracts
extends Thread {
private static TcpTracts tt;
static int i = 1, PORT = 8082;
public static boolean startServer(int port) {
PORT = port;
if (tt == null) {
TcpTracts tt = new TcpTracts();
}
tt.run();
return true;
}
public static boolean startServer() {
if (tt == null) {
TcpTracts tt = new TcpTracts();
}
tt.run();
return true;
}
public static void main(String args[]) {
TcpTracts tt = new TcpTracts();
tt.run();
}
public void run() {
ServerSocket server = null;
Socket client = null;
try {
server = new ServerSocket(PORT);
System.out.println("Web Server is listening on port " +
server.getLocalPort());
for (; ; ) {
client = server.accept(); //接受客户机的连接请求
new ConnectionThread(client, i).start();
i++;
}
}
catch (Exception e) {
System.out.println(e);
}
}
}
/* ConnnectionThread类完成与一个Web浏览器的通信 */
class ConnectionThread
extends Thread {
Socket client; //连接Web浏览器的socket字
int counter; //计数器
public ConnectionThread(Socket cl, int c) {
client = cl;
counter = c;
}
private static long lTcp;
private static Hashtable hTcpTracks;
//以序号索引所有向外TCP通道
private static Hashtable getHashTcpTrachks() {
if (hTcpTracks == null) {
hTcpTracks = new Hashtable();
}
return hTcpTracks;
}
//private final String REQUESTTRACTS="requesttrackts";
//private final String ANSWERTRACTS="answertrackts:";
private final String REQUESTTRACTS = "r";
private final String ANSWERTRACTS = "a:";
private final String FORMATERROR = "format error";
private long lTcpIndex;
public void run() { //线程体
try {
String destIP = client.getInetAddress().toString(); //客户机IP地址
int destport = client.getPort(); //客户机端口号
System.out.println("Connection " + counter + ":connected to " + destIP +
" on port " + destport + ".");
PrintStream outstream = new PrintStream(client.getOutputStream());
DataInputStream instream = new DataInputStream(client.getInputStream());
String inline = instream.readLine(); //读取Web浏览器提交的请求信息
System.out.println("Received:" + inline);
// 1 get tcpindex
if (inline.equals(REQUESTTRACTS)) {
//用户建立连接后,可通过发送一个REQUESTTRACTS建立一个TCP通道,建立成功系统会回送一个序号
lTcpIndex = ++lTcp;
outstream.println(ANSWERTRACTS + lTcpIndex);
}
else if (inline.startsWith(ANSWERTRACTS)) {
//其他用户建立TCP连接后,可通过发送ANSWERTRACTS+序号参与此TCP通道
lTcpIndex = Integer.parseInt(inline.substring(ANSWERTRACTS.length()));
outstream.println(ANSWERTRACTS + lTcpIndex);
}
else {
outstream.println(FORMATERROR);
return;
}
// 2 set tcphash by tcp index
Hashtable hOuts = (Hashtable) getHashTcpTrachks().get(new Long(lTcpIndex));
if (hOuts == null) {
hOuts = new Hashtable();
getHashTcpTrachks().put(new Long(lTcpIndex), hOuts);
}
InputStream is = client.getInputStream();
client.setSoTimeout(3000);
OutputStream os = client.getOutputStream();
byte[] b = new byte[1];
hOuts.put(os, os);
//3 check input and senddata to other
is.read(b);
System.out.println(new String(b));
OutputStream osother;
try {
while (is.read(b) > 0) {
//用户发送的没
Enumeration eOuts = hOuts.keys();
while (eOuts.hasMoreElements()) {
osother = (OutputStream) eOuts.nextElement();
if (!osother.equals(os)) {
osother.write(b);
}
}
System.out.print(new String(b));
}
}
catch (java.net.SocketTimeoutException e) {
hOuts.remove(os);
if (hOuts.size() == 0) {
getHashTcpTrachks().remove(new Long(lTcpIndex));
}
os = null;
is = null;
e.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
hOuts.remove(os);
if (hOuts.size() == 0) {
getHashTcpTrachks().remove(new Long(lTcpIndex));
}
os = null;
is = null;
}
long m1 = 1; //延时
while (m1 < 11100000) {
m1++;
}
client.close();
}
catch (IOException e) {
System.out.println("Exception:" + e);
}
}
}
//jianghukeji@hotmail.com
- TcpTracts( 利用服务器,用于两个或多个私网之间建立tcp连接,可以用于发文件,传语音等 )
- TcpTracts( 利用服务器,用于两个或多个私网之间建立tcp连接,可以用于发文件,传语音等 )
- 计算两个经纬度之间的距离,可以用于查看用户与商家之间的距离
- 异或运算,可以用于加密
- 用于求两个向量之间的距离
- 在JAVA中利用SOCKET创建一个用于收发报文的长连接服务器
- SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据
- SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
- SQL高级语句-JOIN 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
- Elasticsearch 两个可以用于压缩数据尺寸的特性
- 计算两个时间戳间隔时间, (可以用于倒计时
- 自定义的互斥量类,可以用于线程或进程的同步
- 通用读内存工具,可以用于游戏等数据查看。
- 关于php加密算法,可以用于COOKIE加密等
- 异步请求Ajax,respose 可以用于点赞打分等
- 用于
- 什么是心跳线?心跳线,主要用于主从服务器之间,是连接工作机与备份机的网线
- 双向链表实现线程池 用于TCP并发连接
- 好久不见我亲爱的东东了
- 看偶是怎么过圣诞的
- 我先帮你充个数添点人气啊
- ERP实施人员,他就是个翻译!
- 第一章 卡耐基应付对手的方法 一 避免伤害的艺术
- TcpTracts( 利用服务器,用于两个或多个私网之间建立tcp连接,可以用于发文件,传语音等 )
- 第一章 卡耐基应付对手的方法 三 慎重与对手争辩
- 第一章 卡耐基应付对手的方法 二 正视别人的批评
- 三层开发基本概念介绍
- Google排名查询软件下载
- 第二章 卡耐基与人相处的秘诀 一 了解对方的观点
- 第二章 卡耐基与人相处的秘诀 二 与人相处的秘诀
- 第二章 卡耐基与人相处的秘诀 三 巧妙应酬的学问
- 第二章 卡耐基与人相处的秘诀 四 到处受欢迎的方法