上節(jié)回顧:在學(xué)習(xí)了Socket在建立客戶端和服務(wù)器單項(xiàng)通訊中,分別創(chuàng)建獨(dú)立的Socket,并通過(guò)Socket的屬性桅滋。
那么如何將兩個(gè)Socket進(jìn)行連接廓潜,從而達(dá)到客戶端和服務(wù)器之間建立輸入輸出流進(jìn)行通信呢?在上節(jié)中我們已經(jīng)講到唱捣,TCP/IP套接字是最可靠的雙向流協(xié)議,使用TCP/IP可以發(fā)送任意數(shù)量的數(shù)據(jù)。如果發(fā)送方和接收方計(jì)算機(jī)確定好端口髓废,他們就可以通信了,其中的端口用套接字表示该抒。
【示例1】客戶端與服務(wù)器端雙向交流的Socket之服務(wù)器端
import?java.io.BufferedReader;
import?java.io.BufferedWriter;
import?java.io.InputStreamReader;
import?java.io.OutputStreamWriter;
import?java.net.ServerSocket;
import?java.net.Socket;
public?class?Server {
????public?static?void?main(String[] args)?throws?? Exception {
???????ServerSocket server=new ServerSocket(8888);
??????? Socket socket=server.accept();
?????? BufferedReader in=new?BufferedReader(new?? InputStreamReader(socket.getInputStream()));
?????? BufferedWriter out=new?BufferedWriter(new?? OutputStreamWriter(socket.getOutputStream()));
?????? BufferedReader br =?new?BufferedReader(new?? InputStreamReader(System.in));
???????while(true){
?????????? String str=in.readLine();
?????????? System.out.println("客戶端說(shuō):"+str);
?????????? String str2 = "";
?????????? str2 = br.readLine();?? ??//讀到\n為止慌洪,因此一定要輸入換行符!
?????????? out.write(str2+"\n");
?????????? out.flush();
???????????if(str.equals("end"))
??????????????break;
?????????? }
?????? in.close();
?????? out.close();
?????? socket.close();
??? }
}
【示例2】客戶端與服務(wù)器端雙向交流的Socket之客戶端
import?java.io.BufferedReader;
import?java.io.BufferedWriter;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.OutputStreamWriter;
import?java.net.InetAddress;
import?java.net.Socket;
import?java.net.UnknownHostException;
public?class?Client {
????static?Socket?server;
????public?static?void?main(String[] args) {
???????try?{
???????????server?=?new?Socket(InetAddress.getLocalHost(), ? 8888);
?????????? BufferedReader in =?new?BufferedReader(new?? InputStreamReader(
??????????????????server.getInputStream()));
?????????? BufferedWriter out =?new?BufferedWriter(new?? OutputStreamWriter(
??????????????????server.getOutputStream()));
?????????? BufferedReader wt =?new?BufferedReader(new?? InputStreamReader(
????????????????? System.in));
???????????while?(true) {
????????????? String str = wt.readLine();
????????????? out.write(str + "\n");
????????????? out.flush();
??????????????if?(str.equals("end")) {
??????????????????break;
????????????? }
????????????? System.out.println("服務(wù)器發(fā)說(shuō):" + ? in.readLine());
?????????? }
?????????? out.close();
?????????? in.close();
?????????? wt.close();
???????????server.close();
?????? }?catch?(UnknownHostException e) {
?????????? //?TODO?Auto-generated catch block
?????????? e.printStackTrace();
?????? }?catch?(IOException e) {
?????????? //?TODO?Auto-generated catch block
?????????? e.printStackTrace();
?????? }
??? }
}
學(xué)習(xí)以上程序后凑保,會(huì)發(fā)現(xiàn)我們必須按照安排好的順序冈爹,服務(wù)器和客戶端一問(wèn)一答!不夠靈活E芬频伤!那么如何用多線程來(lái)實(shí)現(xiàn)更加靈活的雙向通訊呢?下節(jié)我們繼續(xù)~
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記芝此。筆者江湖人稱 Mr. G憋肖,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼婚苹、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作岸更,從小白逐漸做到工程師、高級(jí)工程師膊升、架構(gòu)師怎炊。精通Java平臺(tái)軟件開發(fā),精通JAVAEE廓译,熟悉各種流行開發(fā)框架评肆。
?筆記包含從淺入深的六大部分:
?A-Java入門階段
?B-數(shù)據(jù)庫(kù)從入門到精通
?C-手刃移動(dòng)前端和Web前端
?D-J2EE從了解到實(shí)戰(zhàn)
?E-Java高級(jí)框架精解
?F-Linux和Hadoop?