‘壹’ java:服务器如何检测客户端已经断开
在客户端退出之后,会出现socket连接中断,此时是会抛出异常,在抛出异常时打印中断的客户端即可。
1. while(Binput.read()!= -1) 这种方法能判断出客户端输入是否为空,客户端断开能跳出死循环,但是得到的数据却从第二个开始了,所以这方法不适宜。
2. 在死循环中加入以下代码:
try {
socket.sendUrgentData(0);
} catch (IOException e) {
done= false; //如果抛出了异常,那么就是断开连接了 跳出无限循环
}
‘贰’ java如何通过tcp向指定的IP发送指令并获得返回的包
以下是一个展示java使用tcp通讯的简单例子,包括服务器和客户端代码:x0dx0ax0dx0a/**x0dx0a *TCPServerx0dx0a */x0dx0aimport java.io.*;x0dx0aimport java.net.*;x0dx0aclass TCPServer{x0dx0a public static void main(String[] args)throws IOException{x0dx0a ServerSocket listen = new ServerSocket(5050);x0dx0a x0dx0a Socket server = listen.accept();x0dx0a InputStream in = server.getInputStream();x0dx0a OutputStream out = server.getOutputStream();x0dx0a char c = (char)in.read();x0dx0a System.out.println("收到:" + c);x0dx0a out.write('s');x0dx0a x0dx0a out.close();x0dx0a in.close();x0dx0a server.close();x0dx0a listen.close();x0dx0a }x0dx0a}x0dx0ax0dx0a/**x0dx0a *TCPClientx0dx0a */x0dx0aimport java.io.*;x0dx0aimport java.net.*;x0dx0aclass TCPClient{x0dx0a public static void main(String[] args)throws IOException{x0dx0a Socket client = new Socket("127.0.0.1" , 5050);x0dx0a InputStream in = client.getInputStream();x0dx0a OutputStream out = client.getOutputStream();x0dx0a x0dx0a out.write('c');x0dx0a char c = (char)in.read();x0dx0a System.out.println("收到:" + c);x0dx0a out.close();x0dx0a in.close();x0dx0a client.close();x0dx0a }x0dx0a}
‘叁’ 在Java中实现TCP协议编程中怎么传
在Java中实现TCP协议编程
ServerSocket:编写TCP网络服务程序,首先要用到java.net.ServerSocket类用以创建服务器Socket
构造方法:
ServerSocket(intport):创建绑定到特定端口的服务器套接字
ServerSocket(intport,intbacklog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(intport,intbacklog,InetAddressbindAddr):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
Socket:客户端要与服务器建立连接,必须先创建一个Socket对象
常用构造方法
Socket(Stringhost,intport):创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(InetAddressaddress,intport):创建一个流套接字并将其连接到指定IP地址的指定端口号。
服务器端程序调用ServerSocket类中的accept()方法等待客户端的连接请求,一旦accept()接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象。建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket类中的getInputStream()返回Socket的输入流对象,getOutputStream()返回Socket的输出流对象。
TCP服务器与TCP客户端间的数据的接受图示:
用TCP实现服务器与客户端的“聊天”:
实例代码:
客户端:
packagecom.hbsi.net;
importjava.net.Socket;
importjava.io.*;
publicclassTcpClient{
publicstaticvoidmain(String[]args)throwsException{
//1.建立tcp客户端socket,要确定要连接的服务器ip,port
Sockets=newSocket("192.168.49.87",9009);
//获取键盘录入
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
//2.通过建立的socket,获取输出流对象
//数据输出给服务器端
OutputStreamout=s.getOutputStream();
BufferedWriterbwout=newBufferedWriter(newOutputStreamWriter(out));
//获取服务器端返回的数据
//读取服务器端发过来的信息InputStreamReader()
BufferedReaderbrin=newBufferedReader(newInputStreamReader(
s.getInputStream()));
Stringline=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
Stringstr=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}
服务器端:
packagecom.hbsi.net;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassTcpServer{
publicstaticvoidmain(String[]args)throwsException{
//1.建立服务器socket
ServerSocketss=newServerSocket(9009);
//2.调用accept()
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+"...connection");
//读取客户的信息的输入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=newBufferedReader(newInputStreamReader(in));
//向客户端发送信息输出流,服务端向客户端返回信息OutputStreamWriter()
BufferedWriterbrout=newBufferedWriter(newOutputStreamWriter(
s.getOutputStream())); Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());//服务器端收到信息后,将信息转为大写返回给客户端toUpperCase()
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}
‘肆’ 鐤镫侸ava璁蹭箟锛氢娇鐢⊿ervletSocket鍒涘缓TCP链嶅姟鍣ㄧ
銆銆 浣跨敤ServletSocket鍒涘缓TCP链嶅姟鍣ㄧ
銆銆浠庡浘 涓鐪嬩笂铡籘CP阃氢俊镄勪袱涓阃氢俊瀹炰綋涔嬮棿骞舵病链夋湇锷″櫒绔 瀹㈡埛绔涔嫔垎 浣嗛偅鏄涓や釜阃氢俊瀹炰綋宸茬粡寤虹珛铏氭嫙阈捐矾涔嫔悗镄勭ず镒忓浘 鍦ㄤ袱涓阃氢俊瀹炰綋娌℃湁寤虹珛铏氭嫙阈捐矾涔嫔墠 蹇呴’链変竴涓阃氢俊瀹炰綋鍏埚仛鍑 涓诲姩濮挎 涓诲姩鎺ユ敹𨱒ヨ嚜鍏朵粬阃氢俊瀹炰綋镄勮繛鎺ヨ锋眰
銆銆Java涓鑳芥帴鍙楀叾浠栭氢俊瀹炰綋杩炴帴璇锋眰镄勭被鏄疭erverSocket ServerSocket瀵硅薄鐢ㄤ簬鐩戝惉𨱒ヨ嚜瀹㈡埛绔镄凷ocket杩炴帴 濡傛灉娌℃湁杩炴帴 瀹冨皢涓鐩村勪簬绛夊緟鐘舵 ServerSocket鍖呭惈涓涓鐩戝惉𨱒ヨ嚜瀹㈡埛绔杩炴帴璇锋眰镄勬柟娉
銆銆Socket accept锛堬级 濡傛灉鎺ユ敹鍒颁竴涓瀹㈡埛绔疭ocket镄勮繛鎺ヨ锋眰 璇ユ柟娉曞皢杩斿洖涓涓涓庡㈡埛绔疭ocket瀵瑰簲镄凷ocket锛埚傚浘 镓绀烘疮涓猅CP杩炴帴链変袱涓猄ocket锛 钖﹀垯璇ユ柟娉曞皢涓鐩村勪簬绛夊緟鐘舵 绾跨▼涔熻阒诲
銆銆涓轰简鍒涘缓ServerSocket瀵硅薄 ServerSocket绫绘彁渚涗简濡备笅鍑犱釜鏋勯犲櫒
銆銆ServerSocket锛坕nt port锛 鐢ㄦ寚瀹氱殑绔鍙port𨱒ュ垱寤轰竴涓猄erverSocket 璇ョ鍙e簲璇ユ槸链変竴涓链夋晥镄勭鍙f暣鏁板 ~
銆銆ServerSocket锛坕nt port int backlog锛 澧炲姞涓涓鐢ㄦ潵鏀瑰彉杩炴帴阒熷垪闀垮害镄勫弬鏁痈acklog
銆銆ServerSocket锛坕nt port int backlog InetAddress localAddr锛 鍦ㄦ満鍣ㄥ瓨鍦ㄥ氢釜 IP鍦板潃镄勬儏鍐典笅 鍏佽搁氲繃localAddr杩欎釜鍙傛暟𨱒ユ寚瀹氩皢ServerSocket缁戝畾鍒版寚瀹氱殑IP鍦板潃
銆銆褰揝erverSocket浣跨敤瀹屾瘯 搴斾娇鐢⊿erverSocket镄刢lose锛堬级鏂规硶𨱒ュ叧闂璇ServerSocket 阃氩父𨱍呭喌涓 链嶅姟鍣ㄤ笉搴旇ュ彧鎺ュ弹涓涓瀹㈡埛绔璇锋眰 钥屽簲璇ヤ笉鏂鍦版帴鍙楁潵镊瀹㈡埛绔镄勬墍链夎锋眰 镓浠Java绋嫔簭阃氩父浼氶氲繃寰鐜 涓嶆柇鍦拌皟鐢⊿erverSocket镄刟ccept锛堬级鏂规硶 濡备笅浠g爜鐗囨垫墍绀
銆銆//鍒涘缓涓涓猄erverSocket 鐢ㄤ簬鐩戝惉瀹㈡埛绔疭ocket镄勮繛鎺ヨ锋眰
銆銆ServerSocket ss = new ServerSocket锛 锛
銆銆//閲囩敤寰鐜涓嶆柇鎺ュ弹𨱒ヨ嚜瀹㈡埛绔镄勮锋眰
銆銆while 锛坱rue锛
銆銆{
銆銆//姣忓綋鎺ュ弹鍒板㈡埛绔疭ocket镄勮锋眰 链嶅姟鍣ㄧ涔熷瑰簲浜х敓涓涓猄ocket
銆銆Socket s = ss accept锛堬级
銆銆//涓嬮溃灏卞彲浠ヤ娇鐢⊿ocket杩涜岄氢俊浜
銆銆钬
銆銆}
銆銆涓婇溃绋嫔簭涓鍒涘缓ServerSocket娌℃湁鎸囧畾IP鍦板潃 鍒栾ServerSocket灏嗕细缁戝畾鍒版湰链洪粯璁ょ殑IP鍦板潃 绋嫔簭涓浣跨敤 浣滀负璇ServerSocket镄勭鍙e彿 阃氩父鎺ㄨ崘浣跨敤 浠ヤ笂镄勭鍙 涓昏佹槸涓轰简阆垮厤涓庡叾浠栧簲鐢ㄧ▼搴忕殑阃氱敤绔鍙e啿绐
杩斿洖鐩褰 鐤镫侸ava璁蹭箟
缂栬緫鎺ㄨ崘
Java绋嫔簭镐ц兘浼桦寲 璁╀綘镄凧ava绋嫔簭镟村揩 镟寸ǔ瀹
鏂版坠瀛Java 缂栫▼
lishixin/Article/program/Java/hx/201311/27266
‘伍’ 求大佬指点 JAVA中TCP/IP服务端收到的数据怎么存到数据库中
无论是哪种语言,TCP的数据都是两种,一种是未解析过的原始报文(十六进制),这种可以存数据库,也可以是日志形式存在日志文件中,当做备份,调试查找问题的时候也可以通过这些原始报文来检查问题所在。另一种就是这些原始报文经过解析后的结果,比如ID、时间、其它数据这些,解析出来后直接插入你预先创建的数据库就可以了,这个就是历史库,当然一般来说,如果你的数据是以不同的设备ID区分的,通常还有一个最新状态库,它跟历史库结构一样,但同一个设备ID只有最新的一条记录。