生活随笔
收集整理的這篇文章主要介紹了
原生JAVA的TCP/UDP编程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、TCP/UDP對(duì)比
二、TCP編程
TCP字節(jié)流編程
- Server端:
public class TCPServerStream {public static void main(String[] args
) {try (ServerSocket serverSocket
= new ServerSocket(9999)) {System.out
.println("server start at port:9999....");Socket accept
= serverSocket
.accept();System.out
.println("client has already connected");try (InputStream inputStream
= accept
.getInputStream();OutputStream outputStream
= accept
.getOutputStream()) {byte[] bytes
=new byte[1024];int text
;while ((text
=inputStream
.read(bytes
))!=-1){System.out
.println(new String(bytes
,0,text
));}outputStream
.write("hello client".getBytes());System.out
.println("server exit...");}} catch (IOException e
) {e
.printStackTrace();};}
}
public class TCPClientStream {public static void main(String[] args
) {System.out
.println("client connecting......");try (Socket socket
= new Socket(InetAddress.getLocalHost(), 9999)) {System.out
.println("client connected......");try (OutputStream outputStream
= socket
.getOutputStream();InputStream inputStream
=socket
.getInputStream()) {outputStream
.write(("hello server".getBytes()));socket
.shutdownOutput();byte[] bytes
=new byte[1024];int text
;while ((text
=inputStream
.read(bytes
))!=-1){System.out
.println(new String(bytes
,0,text
));}System.out
.println("client exit...");}} catch (IOException e
) {e
.printStackTrace();}}
}
注意:
- 這里調(diào)用Socket的shutdownOutput()方法,底層會(huì)告知服務(wù)端我這邊已經(jīng)寫(xiě)完了,那么服務(wù)端收到消息后,就能知道已經(jīng)讀取完消息,如果服務(wù)端有要返回給客戶的消息那么就可以通過(guò)服務(wù)端的輸出流發(fā)送給客戶端,如果沒(méi)有,直接關(guān)閉Socket。
- 這種方式通過(guò)關(guān)閉客戶端的輸出流,告知服務(wù)端已經(jīng)寫(xiě)完了,雖然可以讀到服務(wù)端發(fā)送的消息,但是還是有一點(diǎn)缺點(diǎn):不能再次發(fā)送消息給服務(wù)端,如果再次發(fā)送,需要重新建立Socket連接這個(gè)缺點(diǎn),在訪問(wèn)頻率比較高的情況下將是一個(gè)需要優(yōu)化的地方。
優(yōu)化文章
TCP字符流編程
public class TCPServerCharacterStream extends Thread{private ServerSocket serverSocket
;public static void main(String[] args
) {TCPServerCharacterStream tcpServerCharacterStream
=new TCPServerCharacterStream();tcpServerCharacterStream
.start();}public TCPServerCharacterStream(){try{serverSocket
= new ServerSocket(8888);}catch (Exception e
){e
.printStackTrace();}}@Overridepublic void run() {while (true){try {System.out
.println("server waiting for connecting....");Socket accept
= serverSocket
.accept();System.out
.println("client has already connected....");try (BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(accept
.getInputStream(), "UTF-8"));BufferedWriter bufferedWriter
=new BufferedWriter(new OutputStreamWriter(accept
.getOutputStream(),"UTF-8"))) {System.out
.println("using socket is: "+accept
);System.out
.println("get message : "+bufferedReader
.readLine());bufferedWriter
.write("hello client from server");bufferedWriter
.newLine();System.out
.println("server exit....");}} catch (IOException e
) {e
.printStackTrace();}}}
}
public class TCPClientCharacterStream extends Thread{public static void main(String[] args
) {System.out
.println("client connecting......");try (Socket socket
= new Socket(InetAddress.getLocalHost(), 8888)) {System.out
.println("client connected......");try (BufferedWriter bufferedWriter
= new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream(), "UTF-8"));BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(socket
.getInputStream(),"UTF-8"))){System.out
.println("start to send message....");System.out
.println("using socket is: "+socket
);bufferedWriter
.write("sending: hello server from client");System.out
.println("ending send message...");bufferedWriter
.newLine();bufferedWriter
.flush();System.out
.println(socket
.isClosed());System.out
.println("get message : "+bufferedReader
.readLine());System.out
.println("client exit...");}} catch (IOException e
) {e
.printStackTrace();}}
}
注意:
try resource模式下,如果只是進(jìn)行寫(xiě)操作,不像我這樣讀寫(xiě)切換的話,好像是會(huì)因?yàn)樽詣?dòng)close而自動(dòng)flush。比如我server端里面,因?yàn)閷?xiě)操作是在讀操作后面的,所以try resource自動(dòng)close后也能正常運(yùn)行。但像我client里面,因?yàn)閷?xiě)操作后,try resource段還沒(méi)運(yùn)行完,就必須手動(dòng)flush,才能提交。
總結(jié)
以上是生活随笔為你收集整理的原生JAVA的TCP/UDP编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。