这篇文章主要介绍了java通过 socket 实现 tcp服务端的相关资料,需要的朋友可以参考下
1 java socket简介
所谓socket 通常也称作”套接字“,用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。socket和serversocket类库位于java.net包中。serversocket用于服务器端,socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
2 tcpserver代码实例
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.serversocket;
import java.net.socket;
import java.util.date;
import java.util.hashmap;
import java.util.map;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
/**
* tcp服务器端,单例模式
* @author xiang
*
*/
public class tcpserver implements runnable {
private static final logger logger = loggerfactory.getlogger(tcpserver.class);
//成员变量/
private static tcpserver serverinstance;
private static map<string, socketthread> socketmaps = new hashmap<string,socketthread>();//每个客户端连接时都会新建一个socketthread与之对应 private static serversocket serversocket; //服务器套接字
private static int serport = 9999; //服务器端口号
private static boolean flag; //服务器状态标志
private static final int buffer_size = 512; //数据接收字符数组大小
//构造函数/
private tcpserver() {
}
/**
* 获取实例
* @return tcpserver实例serverinstance
*/
public static tcpserver getserverinstance(){
if(serverinstance==null)
serverinstance = new tcpserver();
return serverinstance;
}
/**
* 开启服务器
* @throws ioexception
*/
public void opentcpserver() throws ioexception{ if(serversocket==null || serversocket.isclosed()){
serversocket = new serversocket(serport);
flag = true;
}
}
/**
* 关闭服务器
* @throws ioexception
*/
public void closetcpserver() throws ioexception{
flag = false; if(serversocket!=null)
serversocket.close();
/*for (map.entry<string, socketthread> entry : socketmaps.entryset()) {
system.out.println("key = " + entry.getkey() + ", value = " + entry.getvalue());
} */
for (socketthread value : socketmaps.values())
value.closeconnect();
socketmaps.clear();
}
/**
* 服务器向客户端发送数据
* @param bytes[]:待发送的字符数组
* @param key 客户端的key,为空或""时表示数据群发
* @throws ioexception
*/
public void sendmessage(string key,byte[] msgbytes){
if(key==null||key.equals("")){
for (socketthread value : socketmaps.values())
value.sendmassage(msgbytes);
}else{
socketthread thread = socketmaps.get(key);
if(thread!=null)
thread.sendmassage(msgbytes);
}
}
/**
* 服务器向客户端发送数据
* @param key 客户端的key,为空或""时表示数据群发
* @param msgstr:待发送的字符串
* @throws ioexception
*/
public void sendmessage(string key,string msgstr){ byte[] sendbyte = msgstr.getbytes();
if(key==null||key.equals("")){
for (socketthread value : socketmaps.values())
value.sendmassage(sendbyte);
}else{
socketthread thread = socketmaps.get(key);
if(thread!=null)
thread.sendmassage(sendbyte);
}
}
@override
public void run() {
logger.info("服务器线程已经启动"); while(true){
try {
while(flag){
logger.info("服务器线程在监听状态中");
socket socket = serversocket.accept();
string key = socket.getremotesocketaddress().tostring();
socketthread thread = new socketthread(socket,key);
thread.start();
socketmaps.put(key, thread);
logger.info("有客户端连接:"+key);
}
} catch (exception e) {
e.printstacktrace();
}
}
}
/**
* 处理连接后的数据接收请求内部类
* @author xiang
*
*/
private class socketthread extends thread{
private socket socket;
private string key;
private outputstream out;
private inputstream in;
//构造函数
public socketthread(socket socket,string key) {
this.socket = socket;
this.key = key;
}
/**
* 发送数据
* @param bytes
* @throws ioexception
*/
public void sendmassage(byte[] bytes){
try {
if(out==null)
out = socket.getoutputstream();
out.write(bytes);
} catch (exception e) {
e.printstacktrace();
try {
closeconnect();
} catch (ioexception e1) {
e1.printstacktrace();
}
socketmaps.remove(key);
}
}
/**
* 关闭连接,释放资源
* @throws ioexception
*/
public void closeconnect() throws ioexception{
if(out!=null) out.close();
if(in!=null) in.close();
if(socket!=null && socket.isconnected()) socket.close();
}
@override
public void run() {
byte[] receivbuf = new byte[buffer_size];
int recvmsgsize;
try {
in = socket.getinputstream();
out = socket.getoutputstream();
while ((recvmsgsize = in.read(receivbuf)) != -1) {
string receiveddata = new string(receivbuf, 0, recvmsgsize);
system.out.println("reverve form[port" + socket.getport() + "]:" + receiveddata);
system.out.println("now the size of socketmaps is" + socketmaps.size());
/**************************************************************
*
* 接收数据后的处理过程
*
**************************************************************/
}
// response to client
byte[] sendbyte = "the server has received".getbytes();
// out.write(sendbyte, 0, sendbyte.length);
out.write(sendbyte);
system.out.println("to cliect[port:" + socket.getport() + "] 回复客户端的消息发送成功");
closeconnect();
socketmaps.remove(key);
} catch (exception e) {
e.printstacktrace();
try {
closeconnect();
} catch (ioexception e1) {
e1.printstacktrace();
}
}
}
//////////////
public int getport(){
return socket.getport();
}
}
//. end socketthread
}
【相关推荐】
1. 特别推荐:“php程序员工具箱”v0.1版本下载
2. java免费视频教程
3. 全面解析java注解
以上就是java通过"套接字"向网络发出请求的详细内容。