-
java的網(wǎng)絡(luò)支持
查看全部 -
socket通信實(shí)現(xiàn)步驟
查看全部 -
socket通信模型
查看全部 -
socket通信
查看全部 -
TCP/IP模型
查看全部 -
基于UDP的多線程登陸
/** *?服務(wù)器端,實(shí)現(xiàn)基于UDP的用戶登錄? *?@author?Strawberry? * */ public?class?Test006_UDPServer?{ ????public?static?void?main(String[]?args)?throws?IOException?{ ????//創(chuàng)建服務(wù)器DatagramSocket,并指定端口 ????DatagramSocket?datagramSocket=new?DatagramSocket(8800); ????//創(chuàng)建數(shù)據(jù)報(bào),用于接收客戶端信息 ????byte[]?data=new?byte[1024]; ????int?count=0; ????System.out.println("***Server?start,?waiting?data?from?client..***"); ????//開(kāi)始接收客戶端信息 ???????while(true){ ??????????DatagramPacket?datagramPacket=new?DatagramPacket(data,?data.length); ??????????datagramSocket.receive(datagramPacket);//此方法在接收到數(shù)據(jù)報(bào)之前會(huì)一直阻塞 ??????????Test006_ServerThread?serverThread=new?Test006_ServerThread(datagramSocket,?datagramPacket); ??????????serverThread.start(); ??????????count++; ??????????System.out.println("client?connected:"+count); ??????????serverThread.sendData(); ???????} ???//關(guān)閉資源 ???//datagramSocket.close(); ??} }
/**? *??線程處理類? *?@author?Strawberry? *? */ public?class?Test006_ServerThread?extends?Thread{ ??DatagramSocket?datagramSocket=null; ??DatagramPacket?datagramPacket=null; ?? ??public?Test006_ServerThread(DatagramSocket?datagramSocket,DatagramPacket?datagramPacket){ ??????this.datagramSocket=datagramSocket; ??????this.datagramPacket=datagramPacket; ??} ?? ??public?void?run(){ ??????//接收客戶端信息 ??????byte[]?data=datagramPacket.getData(); ??????String?info=new?String(data,?0,?datagramPacket.getLength()); ??????System.out.println("[Info?from?client]:???"+info); ??} ?????? ??public?void?sendData(){ ???????//響應(yīng)客戶端信息 ??????try?{ ??????????InetAddress?address=datagramPacket.getAddress(); ??????????int?port=datagramPacket.getPort(); ??????????String?info2="Login?Success!"; ??????????byte[]?data2=info2.getBytes(); ??????????DatagramPacket?datagramPacket2=new?DatagramPacket(data2,?data2.length,?address,?port); ??????????datagramSocket.send(datagramPacket2); ??????}?catch?(IOException?e)?{ ??????????//?TODO?Auto-generated?catch?block ??????????e.printStackTrace(); ??????} ??} }
查看全部 -
TCP/IP模型
查看全部 -
Socket總結(jié):
Socket通信原理? 基于TCP的Socket通信
經(jīng)驗(yàn)與技巧:
多線程的優(yōu)先級(jí)/是否關(guān)閉輸出流和輸入流/使用TCP通信傳輸對(duì)象/socke編程傳遞文件
查看全部 -
基于UDP客戶端實(shí)現(xiàn):
//1、定義服務(wù)器的地址、端口號(hào)、數(shù)據(jù)
InetAddress address=InetAddress.getByName("localhost");
int port=8800;
byte[] data="用戶名:admin;密碼:123".getBytes();
//2、創(chuàng)建數(shù)據(jù)報(bào),包含發(fā)送的數(shù)據(jù)信息
DatagramPacket packet=new DatagramPacket(data, data.length,address,port);
//3、創(chuàng)建DatagramSocket對(duì)象
DatagramSocket socket=new DatagramSocket();
//4、向服務(wù)器端發(fā)送數(shù)據(jù)報(bào)
socket.send(packet);
查看全部 -
服務(wù)器端實(shí)現(xiàn)步驟:
1、創(chuàng)建DatagramSocket,指定端口號(hào)
2、創(chuàng)建DatagramPacket
3、接受客戶端發(fā)送的數(shù)據(jù)信息
4、讀取信息
服務(wù)器端實(shí)現(xiàn)步驟
1、定義發(fā)送信息
2、創(chuàng)建DatagramPacket包含需發(fā)送的信息
3、創(chuàng)建DatagramSocket
4、發(fā)送信息
服務(wù)器端實(shí)現(xiàn):
//1、創(chuàng)建服務(wù)器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8888);
//2、創(chuàng)建數(shù)據(jù)報(bào),用于接收客戶端發(fā)送的數(shù)據(jù)
byte[] data=new byte[1024];//創(chuàng)建字節(jié)數(shù)組,指定接受的數(shù)據(jù)包的大小
DatagramPacket packet=new DatagramPacket(data,data.length);
//3、接收客戶端發(fā)送的數(shù)據(jù)
socket.receive(packet);//此方法在接收到數(shù)據(jù)包之前會(huì)一直阻塞
//4、讀取數(shù)據(jù)
String info=new String(data,0,packet.getLength());
System.out.println("我是服務(wù)器,客戶端發(fā)送信息:"+info);
查看全部 -
UDP協(xié)議(用戶數(shù)據(jù)報(bào)協(xié)議)是無(wú)連接、不可靠、無(wú)序的
UDP協(xié)議以數(shù)據(jù)報(bào)作為數(shù)據(jù)傳輸載體。進(jìn)行數(shù)據(jù)傳輸時(shí),首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(bào)(Datagram),在數(shù)據(jù)報(bào)中指明數(shù)據(jù)所要達(dá)到的Socket(主機(jī)地址和端口號(hào)),然后再將數(shù)據(jù)報(bào)發(fā)送出去
DatagramPacket:表示數(shù)據(jù)報(bào)包
DatagramSocket:進(jìn)行端到端通信的類
查看全部 -
多線程實(shí)現(xiàn)多客戶端的通信:
創(chuàng)建服務(wù)器線程處理類,傳遞監(jiān)聽(tīng)到的客戶端Socket,重寫(xiě)run()方法實(shí)現(xiàn)讀取客戶端信息并反饋客戶端
//在服務(wù)端中循環(huán)監(jiān)聽(tīng)等待客戶端的連接實(shí)現(xiàn)多線程
while(true) {
//調(diào)用accept()監(jiān)聽(tīng),等待客戶端的連接
socket=serverSocket.accept();
//創(chuàng)建一個(gè)新的線程
ServerThread serverThread=new ServerThread(socket);
//啟動(dòng)線程
serverThread.start();
count++;
System.out.println("客戶端數(shù)量為:"+count);
InetAddress address=socket.getInetAddress();
System.out.println("客戶端ip地址為:"+address.getHostAddress());
}
查看全部 -
服務(wù)器響應(yīng)客戶端:
//獲取輸出流響應(yīng)客戶端請(qǐng)求
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);//包裝成打印流
pw.println("登陸成功");
pw.flush();//調(diào)用flush()方法將緩沖輸出
//獲取輸入流,讀取服務(wù)端的相應(yīng)信息
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null) {
System.out.println("服務(wù)器反饋:"+info);
}
查看全部 -
客戶端:
//1、創(chuàng)建客戶端Socket,指定服務(wù)器地址和端口
try {
Socket socket=new Socket("localhost",8888);
//2、獲取輸出流,向服務(wù)端發(fā)送信息
OutputStream os=socket.getOutputStream();//字節(jié)輸出流
PrintWriter pw=new PrintWriter(os);//將輸出流包裝為打印流
pw.write("用戶名:admin;密碼:123");
pw.flush();
socket.shutdownOutput();
//3、關(guān)閉資源
pw.close();
os.close();
socket.close();
查看全部 -
服務(wù)端:
//1、創(chuàng)建一個(gè)服務(wù)器端Socket,即ServerSocket,指定綁定的端口,并監(jiān)聽(tīng)此端口
try {
ServerSocket serverSocket=new ServerSocket(8888);
//2、調(diào)用accept()方法開(kāi)始監(jiān)聽(tīng),等待客戶端的連接
System.out.println("? 服務(wù)器即將啟動(dòng),等待客戶端連接? ? ");
Socket socket=serverSocket.accept();
//3、獲取輸入流,并讀取客戶端信息
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null) {
System.out.println("我是服務(wù)器,客戶端傳遞信息:"+info);
}
socket.shutdownInput();
//4、關(guān)閉服務(wù)器端
is.close();
isr.close();
br.close();
serverSocket.close();
查看全部
舉報(bào)