-
socket編程傳遞文件
查看全部 -
使用TCP通信傳輸對(duì)象
查看全部 -
直接關(guān)閉socket,即流也一起關(guān)閉。
查看全部 -
多線程通信的優(yōu)先級(jí)問題
查看全部 -
客戶端實(shí)現(xiàn)步驟
/*UDP客戶端*/ public?class?UDPClient?{ ?public?static?void?main(String[]?args)?{ ??try?{ ???//向服務(wù)器端發(fā)送數(shù)據(jù) ???//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ù)器端響應(yīng)的數(shù)據(jù) ???//1.創(chuàng)建數(shù)據(jù)報(bào),用于接收服務(wù)器端響應(yīng)的數(shù)據(jù) ???byte[]?data2?=?new?byte[1024]; ???DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length); ???//2.接收服務(wù)器響應(yīng)的數(shù)據(jù) ???socket.receive(packet2); ???//3.讀取數(shù)據(jù) ???String?reply?=?new?String(data2,0,packet2.getLength()); ???System.out.println("我是客戶端,服務(wù)器端說:"+reply); ???//4.關(guān)閉資源 ???socket.close(); ??}?catch?(UnknownHostException?e)?{ ???e.printStackTrace(); ??}?catch?(SocketException?e)?{ ???e.printStackTrace(); ??}?catch?(IOException?e)?{ ???e.printStackTrace(); ??} ?} }
查看全部 -
服務(wù)器端實(shí)現(xiàn)步驟
/*UDP服務(wù)器端,實(shí)現(xiàn)基于UDP的用戶登陸*/ public?class?UDPServer?{ ?public?static?void?main(String[]?args)?{ ??try?{ ???//接收客戶端發(fā)送的數(shù)據(jù) ???//1.創(chuàng)建服務(wù)器端DatagramScoket,指定端口 ???DatagramSocket?socket?=?new?DatagramSocket(8800); ???//2.創(chuàng)建數(shù)據(jù)報(bào),用于接收客戶端發(fā)送的數(shù)據(jù) ???byte[]?data?=?new?byte[1024];//創(chuàng)建字節(jié)數(shù)組,指定接受的數(shù)據(jù)報(bào)的大小 ???DatagramPacket?packet?=?new?DatagramPacket(data,?data.length); ???//3.接受客戶端發(fā)送的數(shù)據(jù) ???System.out.println("服務(wù)器端已經(jīng)啟動(dòng),等待客戶端發(fā)送數(shù)據(jù)"); ???socket.receive(packet);//此方法在接收到數(shù)據(jù)報(bào)之前會(huì)一直阻塞 ???//4.讀取數(shù)據(jù) ???String?info?=?new?String(data,0,packet.getLength()); ???System.out.println("我是服務(wù)器,客戶端說:"+info); ??? ???//向客戶端響應(yīng)數(shù)據(jù) ???//1.定義客戶端的地址、端口號(hào)、數(shù)據(jù) ???InetAddress?address?=?packet.getAddress(); ???int?port?=?packet.getPort(); ???byte[]?data2?=?"歡迎你!".getBytes(); ???//2.創(chuàng)建數(shù)據(jù)報(bào),包含響應(yīng)的數(shù)據(jù)信息 ???DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length,address,port); ???//3.響應(yīng)客戶端 ???socket.send(packet2); ???//4.關(guān)閉資源 ???socket.close(); ??}?catch?(SocketException?e)?{ ???e.printStackTrace(); ??}?catch?(IOException?e)?{ ???e.printStackTrace(); ??} ?} }
查看全部 -
UDP編程
? 1、UDP協(xié)議(用戶數(shù)據(jù)報(bào)協(xié)議)是無連接、不可靠、無序的。
? 2、UDP協(xié)議以數(shù)據(jù)報(bào)作為數(shù)據(jù)傳輸?shù)妮d體。
? 3、使用UDP進(jìn)行數(shù)據(jù)傳輸時(shí),首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(bào)(Datagram),在數(shù)據(jù)報(bào)中指明所要達(dá)到的Socket(主機(jī)地址和端口號(hào)),然后在將數(shù)據(jù)報(bào)發(fā)生出去。
? 4、相關(guān)操作類:DatagramPacket:表示數(shù)據(jù)報(bào)包
???????????????? DatagramSocket:進(jìn)行端到端通信的類
DatagramPacket類構(gòu)造方法:
? 1、DatagramPacket(byte[] buf,int length)//接受長度為length的數(shù)據(jù)包
? 2、DatagramPacket(byte[] buf,int length,InetAddress address,int port)//將指定長度的字節(jié)發(fā)生到指定主機(jī)的指定端口
DatagramSocket類
? 1、構(gòu)造方法:DatagramSocket();
?????????????? DatagramSocket(int port,InetAddress laddr);
? 2、close();//關(guān)閉DatagramSocket
? 3、getInetAddress();//獲取地址
? 4、getPort();//獲取端口號(hào)
? 5、send(DatagramPacket p);//從此套接字發(fā)送數(shù)據(jù)包
???? recrive(DatagramPacket p);//從此套接字接收數(shù)據(jù)包查看全部 -
UDP編程操作
查看全部 -
主線程負(fù)責(zé)創(chuàng)建socket
* 一個(gè)線程用來讀取
* 一個(gè)線程用來寫入,用兩個(gè)內(nèi)部類
* 要用多線程實(shí)現(xiàn),send線程和recived線程同時(shí)訪問buff數(shù)據(jù)區(qū)。
* 發(fā)送完成后notify,接收線程。接收線程自身wait
* 接收的說,我先wait一下,可能緩存中還沒有數(shù)據(jù),我會(huì)拿到空值的。
* 發(fā)送的說Ok,我先寫,寫完了我notifyall你。我就一直鎖著。變成并行處理了。
每個(gè)客戶端連接服務(wù)端都會(huì)產(chǎn)生一個(gè)新的socket。socket關(guān)閉條件時(shí)
一種寫法:if(socket!=null)socket.close();
另一種寫法:if(!socket.isClosed())socket.close();
查看全部 -
多線程服務(wù)器操作
查看全部 -
服務(wù)器向客戶端進(jìn)行響應(yīng)
//獲取輸出流,響應(yīng)客戶端的請(qǐng)求 OutputStream?os=socket.getOutputStream(); PrintWriter?pw=new?PrintWriter(os);//包裝為打印流 pw.write("歡迎您!"); pw.flush();//調(diào)用flush()方法刷新緩沖輸出 //關(guān)閉資源 pw.close(); os.close(); socket.close();
--------------------------------
客戶端接收服務(wù)器發(fā)送的消息InputStream?is=socket.getInputStream(); BufferedReader?br=new?BufferedReader(new?InputStreamReader(is)); String?line; while((line=br.readerline()!=null) { ????System.out.println("我是客戶端,服務(wù)器說:"+line); } is.close(); br.close(); socket.close();
查看全部 -
/*TCP服務(wù)器端*/ public?class?Server?{? ????public?static?void?main(String[]?args)?{?? ????????try?{??? ????????????//1.創(chuàng)建一個(gè)服務(wù)器端Socket,即ServerSocket,指定綁定的端口,并監(jiān)聽此端口??? ????????????ServerSocket?serverSocket?=?new?ServerSocket(8888);??? ????????????//2.調(diào)用accept()方法開始監(jiān)聽,等待客戶端的連接??? ????????????System.out.println("服務(wù)器即將啟動(dòng),等待客戶端的連接");??? ????????????Socket?socket?=?serverSocket.accept();??? ????????????//3.獲取輸入流,并讀取客戶端信息??? ????????????InputStream?is?=?socket.getInputStream();//字節(jié)輸入流??? ????????????InputStreamReader?isr?=?new?InputStreamReader(is);//將字節(jié)流包裝為字符流 ????????????BufferedReader?br?=?new?BufferedReader(isr);//為輸入流添加緩沖??? ????????????String?info?=?null;??? ????????????while((info=br.readLine())!=null){//循環(huán)讀取客戶端的信息???? ????????????????System.out.println("我是服務(wù)器,客戶端說:"+info);??? ????????????}??? ????????????socket.shutdownInput();//關(guān)閉輸入流?????? ????????????//4.關(guān)閉資源??? ????????????br.close();??? ????????????isr.close();??? ????????????is.close();??? ????????????socket.close();??? ????????????serverSocket.close();?? ????????}?catch?(IOException?e)?{??? ????????????e.printStackTrace();?? ????????}??? ????} }
/*TCP客戶端*/ public?class?Client?{? ????public?static?void?main(String[]?args)?{?? ????????try?{??? ????????????//1.創(chuàng)建客戶端Socket,指定服務(wù)器地址和端口??? ????????????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();//關(guān)閉輸出流?????? ????????????//3.關(guān)閉資源??? ????????????pw.close();??? ????????????os.close();??? ????????????socket.close();?? ?????????}?catch?(UnknownHostException?e)?{??? ????????????e.printStackTrace();?? ?????????}?catch?(IOException?e)?{??? ?????????????e.printStackTrace();?? ?????????}? ????} }
查看全部 -
服務(wù)端:
1、創(chuàng)建ServerSocket對(duì)象,綁定監(jiān)聽端口
2、通過accept()方法監(jiān)聽客戶端請(qǐng)求
3、連接建立后,通過輸入流讀取客戶端發(fā)送的請(qǐng)求信息
4、通過輸出流向客戶端發(fā)送響應(yīng)信息
5、關(guān)閉相關(guān)資源
客戶端:
1、創(chuàng)建Socket對(duì)象,指明需要連接的服務(wù)器的地址和端口號(hào)
2、連接建立后,通過輸出流向服務(wù)器端發(fā)送請(qǐng)求信息
3、通過輸入流獲取服務(wù)器相應(yīng)的信息
4、關(guān)閉相關(guān)資源。查看全部 -
客戶端的操作
查看全部 -
服務(wù)器端的操作
查看全部
舉報(bào)