网络通信-2(TCP通信、ServerSocket、Socket)
1. TCP通信
UDP中只有發(fā)送端和接收端,不區(qū)分客戶(hù)端和服務(wù)器端。計(jì)算機(jī)之間可以任意地發(fā)送消息。
TCP通信嚴(yán)格區(qū)分客戶(hù)端和服務(wù)器。
通信時(shí),必須由客戶(hù)端去連接服務(wù)器才能實(shí)現(xiàn)通信。服務(wù)器不可主動(dòng)連接客戶(hù)端。
且服務(wù)器應(yīng)事先啟動(dòng),等待客戶(hù)端的連接。
2. ServerSocket
2.1 構(gòu)造方法
ServerSocket(int port):創(chuàng)建綁定到特定端口的服務(wù)器套接字。
2.2 常用方法
Socket accept():?偵聽(tīng)并接受到此套接字的連接。
- accept()之后,服務(wù)器端程序會(huì)發(fā)生阻塞,直到客戶(hù)端發(fā)出連接請(qǐng)求,accept()才會(huì)返回一個(gè)Socket對(duì)象,用于和客戶(hù)端實(shí)現(xiàn)通信,陳故鄉(xiāng)才能繼續(xù)向下執(zhí)行。
InetAddress getInetAddress():返回此服務(wù)器套接字的本地地址。
3. Socket
此類(lèi)實(shí)現(xiàn)客戶(hù)端套接字(也可以就叫“套接字”)。套接字是兩臺(tái)機(jī)器間通信的端點(diǎn)。
3.1 構(gòu)造方法
Socket(String host,int port):?創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號(hào)。
3.2 常用方法
int gerPort():?返回此套接字連接到的遠(yuǎn)程端口。
- 該對(duì)象是和Socket對(duì)象相連的端口號(hào)
InetAddress getLocalAddress():?獲取套接字綁定的本地地址。
- 用于獲取Socket對(duì)象綁定的本地IP地址,并將IP地址封裝成InetAddress對(duì)象返回
close():關(guān)閉Socket連接
InputStream getInputStream():返回此套接字的輸入流。
- 該對(duì)象由服務(wù)器的Socket返回,則用于讀取客戶(hù)端發(fā)動(dòng)的數(shù)據(jù)
- 反之,則用于讀取服務(wù)器發(fā)送的數(shù)據(jù)
OutputStream getOutputStream():??返回此套接字的輸出流。
- 若該對(duì)象是由服務(wù)器端的Socket返回的,則適用于向客戶(hù)端發(fā)送數(shù)據(jù)
- 反之,用于向客戶(hù)端發(fā)送數(shù)據(jù)
4. 具體實(shí)現(xiàn)
4.1 TCP服務(wù)器端
4.2 TCP客戶(hù)端
4.3 運(yùn)行結(jié)果
5.圖片上傳案例
5.1分析
5.2服務(wù)器端
package PicDemo;import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;public class Server{public static void main(String[] args) throws IOException {//1.創(chuàng)建服務(wù)端Socket對(duì)象ServerSocket ss = new ServerSocket(8888);//監(jiān)聽(tīng)Socket s = ss.accept();//7.獲取輸入流對(duì)象InputStream is = s.getInputStream();//8.創(chuàng)建本地輸入流OutputStream os=new FileOutputStream("E:\\b.jpg");//9.讀數(shù)據(jù)byte[] bys = new byte[1024];int len;//用于存儲(chǔ)讀取到的字節(jié)個(gè)數(shù)while((len = is.read(bys))!=-1) {os.write(bys,0,len);}//10.獲取Socket輸出流OutputStream sos=s.getOutputStream();//返回?cái)?shù)據(jù)(發(fā)出數(shù)據(jù))sos.write("圖片上傳成功!".getBytes());//釋放資源sos.close();os.close();is.close();s.close();//ss.close();//服務(wù)端一般不關(guān)閉} }5.3服務(wù)器端
package PicDemo;import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//2.創(chuàng)建客戶(hù)端Socket對(duì)象Socket s = new Socket("10.170.7.148",8888);//3.獲取Socket輸出流對(duì)象OutputStream os = s.getOutputStream();//4.創(chuàng)建字節(jié)輸入流InputStream is=new FileInputStream("D:\\JAVA\\a.jpg");//5.把數(shù)據(jù)源中的字節(jié)流寫(xiě)到Socket輸出流中int len=-1;byte[] bys=new byte[1024];while((len=is.read(bys))!=-1) {os.write(bys,0,len);}//6.讀完后,告訴服務(wù)器端s.shutdownOutput();//12.接收數(shù)據(jù)InputStream iis=s.getInputStream();len = iis.read(bys);//輸出數(shù)據(jù)System.out.println(new String(bys,0,len));//釋放資源is.close();os.close();s.close();} }運(yùn)行結(jié)果:
注:客戶(hù)端第6步中,需進(jìn)行調(diào)用shutdownOutput();告訴服務(wù)器數(shù)據(jù)讀取完畢,否則程序不結(jié)束。
?
?
總結(jié)
以上是生活随笔為你收集整理的网络通信-2(TCP通信、ServerSocket、Socket)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络通信-1(InetAddress、U
- 下一篇: DBUtils、连接池