中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

建設(shè)網(wǎng)站代碼電商熱門關(guān)鍵詞

建設(shè)網(wǎng)站代碼,電商熱門關(guān)鍵詞,河北省廊坊市建設(shè)網(wǎng)站,青島網(wǎng)站建設(shè)優(yōu)化網(wǎng)絡(luò)一級目錄二、socket套接字三、UDP數(shù)據(jù)報套接字四、TCP流套接字一級目錄 1.局域網(wǎng)、廣域網(wǎng) 2.IP地址是什么? IP地址是標(biāo)識主機(jī)在網(wǎng)絡(luò)上的地址 IP地址是如何組成的? 點(diǎn)分十進(jìn)制,將32位分為四個部分,每個部分一個字節(jié)&#xff…

網(wǎng)絡(luò)

  • 一級目錄
    • 二、socket套接字
      • 三、UDP數(shù)據(jù)報套接字
        • 四、TCP流套接字

一級目錄

1.局域網(wǎng)、廣域網(wǎng)

2.IP地址是什么?

IP地址是標(biāo)識主機(jī)在網(wǎng)絡(luò)上的地址
IP地址是如何組成的?
點(diǎn)分十進(jìn)制,將32位分為四個部分,每個部分一個字節(jié),范圍是0-255

3.端口號是什么?

端口號是區(qū)分一臺主機(jī)上不同的應(yīng)用程序。

4.客戶端和服務(wù)器

客戶端是發(fā)起請求方。服務(wù)器是響應(yīng)請求。
1.一對一形式:客戶端發(fā)送一個請求,服務(wù)器響應(yīng)一個請求;
2.一對多形式:客戶端發(fā)送一個請求,服務(wù)器響應(yīng)多個請求;
3.多對一形式:客戶端發(fā)送多個請求,服務(wù)器響應(yīng)一個請求;
4.多對多形式:客戶端發(fā)送多個請求,服務(wù)器響應(yīng)多個請求。

5.協(xié)議

主機(jī)和主機(jī)之間通信需要遵循一些協(xié)議。
兩臺主機(jī)之間通信,需要通過一個 五元組 來描述通信
五元組是什么?
源ip,源端口,目的ip,目的端口,協(xié)議類型。

6.協(xié)議分段

1.OSI模型:物理層->數(shù)據(jù)鏈路層->網(wǎng)絡(luò)層->運(yùn)輸層->會話層->表示層->應(yīng)用層
2.TCP/IP五層模型:物理層->數(shù)據(jù)鏈路層->網(wǎng)絡(luò)層->運(yùn)輸層->應(yīng)用層
應(yīng)用層:應(yīng)用程序
運(yùn)輸層:只關(guān)注起點(diǎn)和終點(diǎn)
網(wǎng)絡(luò)層:關(guān)注網(wǎng)絡(luò)中任意兩臺機(jī)器的網(wǎng)絡(luò)通信路徑和具體的傳輸方式
數(shù)據(jù)鏈路層:相鄰主機(jī)之間的數(shù)據(jù)傳輸
物理層:網(wǎng)絡(luò)傳輸?shù)幕A(chǔ)設(shè)施
下層協(xié)議給上層協(xié)議提供功能支持,上層協(xié)議依賴下層協(xié)議。

7.網(wǎng)絡(luò)編程

網(wǎng)絡(luò)編程是什么?
在網(wǎng)絡(luò)上,不同進(jìn)程通過編碼方式進(jìn)行數(shù)據(jù)通信,叫做網(wǎng)絡(luò)編程。

二、socket套接字

1.socket套接字是什么?

socket套接字是操作系統(tǒng)提供的網(wǎng)絡(luò)通信技術(shù),是基于TCP/IP協(xié)議的操作基本單元。基于socket應(yīng)用程序開發(fā)就是網(wǎng)絡(luò)編程。

2.socket套接字的分類

1.數(shù)據(jù)報套接字:基于UDP協(xié)議
2.流套接字:基于TCP協(xié)議
UDP和TCP的區(qū)別:
UDP:1.無連接;2.不可靠傳輸;3.面向數(shù)據(jù)報;4.全雙工。
TCP:1.有連接;2.可靠傳輸;3.面向字節(jié)流;4.全雙工。
什么是可靠傳輸?
發(fā)送方知道接受方是否正確收到信息。
不可靠傳輸:發(fā)送發(fā)不知道接受方是否正確收到信息。

三、UDP數(shù)據(jù)報套接字

1.Java數(shù)據(jù)報套接字通信模型(基于UDP協(xié)議)

DatagramSocket:描述一個soket對象,在操作系統(tǒng)中,一切皆文件,管理硬件設(shè)備和軟件資源,都是通過文件的方式來管理,網(wǎng)卡是硬件設(shè)備,要想操作網(wǎng)卡,需要寫一個socket文件,通過讀寫socket文件來操作網(wǎng)卡。
socket實(shí)際上是一個文件描述符表。
DatagramPacket:描述一個UDP數(shù)據(jù)報。

2.利用DatagramSocket和DatagramPacket來寫一個回顯服務(wù)器(UDP socket)

//客戶端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class UdpEchoClient02 {DatagramSocket socket=null;String serverIp;int serverPort;public UdpEchoClient02(String serverIp,int serverPort) throws SocketException {this.serverIp=serverIp;this.serverPort=serverPort;socket=new DatagramSocket();}//客戶端需要知道服務(wù)器的ip地址和端口號public void start() throws IOException {Scanner in=new Scanner(System.in);while (true){System.out.println("client02:用戶輸入請求->");String request=in.next();if(request.equals("exist")){System.out.println("系統(tǒng)退出");return;}DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);socket.send(requestPacket);DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);String response=new String(responsePacket.getData(),0,responsePacket.getLength());String log=String.format("[%s,%s],request:%s,response:%s",responsePacket.getAddress(),responsePacket.getPort(),request,response);System.out.println(log);}}public static void main(String[] args) throws IOException {UdpEchoClient02 udpEchoClient02=new UdpEchoClient02("127.0.0.1",7010);udpEchoClient02.start();}
}
//服務(wù)器端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//服務(wù)器端
public class UdpEchoService02 {DatagramSocket socket=null;public UdpEchoService02(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("service02:啟動服務(wù)器");while(true){DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);String request=new String(requestPacket.getData(),0,requestPacket.getLength());String response=getResponse(request);DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);String log=String.format("[%s,%d]:request:%s;response:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);System.out.println(log);}}public String getResponse(String request){return request;}public static void main(String[] args) throws IOException {UdpEchoService02 udpEchoService02=new UdpEchoService02(7010);udpEchoService02.start();}
}

結(jié)果:
在這里插入圖片描述
在這里插入圖片描述

3."翻譯"程序

英譯漢:客戶端輸入請求為英文單詞,返回的響應(yīng)式中文解釋。

//客戶端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;//客戶端
public class UdpClient {DatagramSocket socket=null;String serverIp;int serverPort;public UdpClient(String serverIp,int serverPort) throws SocketException {this.serverIp=serverIp;this.serverPort=serverPort;socket=new DatagramSocket();}public void start() throws IOException {Scanner in=new Scanner(System.in);while(true){//1.用戶輸入請求String request=in.next();if(request.equals("exit")){System.out.println("系統(tǒng)退出");return;}//2.根據(jù)用戶輸入構(gòu)造請求,并將請求發(fā)送給服務(wù)器DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);socket.send(requestPacket);//3.接收服務(wù)器的響應(yīng)DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//4.解析服務(wù)器響應(yīng)String response=new String(responsePacket.getData(),0,responsePacket.getLength());//5.日志打印String log=String.format("[%s,%d],request:%s,response:%s",responsePacket.getAddress(),responsePacket.getPort(),request,response);System.out.println(log);}}public static void main(String[] args) throws IOException {UdpClient udpClient=new UdpClient("127.0.0.1",9090);udpClient.start();}
}
//服務(wù)器
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.HashMap;//服務(wù)器端
public class UdpServer {DatagramSocket socket=null;HashMap<String,String> hashMap=new HashMap<>();public UdpServer(int port) throws SocketException {socket=new DatagramSocket(port);//初始化hashMaphashMap.put("你好","hello");hashMap.put("明天","tomorrow");hashMap.put("客戶端","client");hashMap.put("服務(wù)器","server");}public void start() throws IOException {System.out.println("啟動服務(wù)器");while(true){//1.接收用戶請求DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//2.解析用戶請求String request=new String(requestPacket.getData(),0,requestPacket.getLength());//3.根據(jù)用戶請求構(gòu)造響應(yīng)String response=process(request);DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//4.打印日志String log=String.format("[%s,%d]:request:%s,response:%s",responsePacket.getAddress(),responsePacket.getPort(),request,response);System.out.println(log);}}public String process(String request){return hashMap.getOrDefault(request,"該詞在詞典中不存在");}public static void main(String[] args) throws IOException {UdpServer udpServer=new UdpServer(9090);udpServer.start();}
}

客戶端:
在這里插入圖片描述
服務(wù)器:
在這里插入圖片描述

4.擴(kuò)展"翻譯器"

上面代碼用的是HashMap,在下面的代碼中,讓代碼連接數(shù)據(jù)庫,待查詞中文,去數(shù)據(jù)庫中查表,查出對應(yīng)的英文。

a.數(shù)據(jù)庫設(shè)計(jì)

//1.數(shù)據(jù)庫設(shè)計(jì)
//db.sql
create database if not exists test_2_8 ;
use test_2_8;drop table if exists translate;
create table translate (id int primary key auto_increment,chinese varchar(50),english varchar(50)
);
insert into translate values(null,"你好","hello");
insert into translate values(null,"服務(wù)器","server");
insert into translate values(null,"客戶端","client");

b.針對數(shù)據(jù)表,創(chuàng)建數(shù)據(jù)表對象

//創(chuàng)建數(shù)據(jù)表對象
//+----+-----------+---------+
//        | id | chinese   | english |
//        +----+-----------+---------+
//        |  1 | 你好      | hello   |
//        |  2 | 服務(wù)器    | server  |
//        |  3 | 客戶端    | client  |
//        +----+-----------+---------+
public class Translate {private int id;private String chinses;private String english;@Overridepublic String toString() {return "Translate{" +"id=" + id +", chinses='" + chinses + '\'' +", english='" + english + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getChinses() {return chinses;}public void setChinses(String chinses) {this.chinses = chinses;}public String getEnglish() {return english;}public void setEnglish(String english) {this.english = english;}
}

c.連接數(shù)據(jù)庫

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class Util {private static final String URL="jdbc:mysql://127.0.0.1:3306/test_2_8?characterEncoding=utf8&&useSSL=false";private static final String USERNAME="root";private static final String PASSWORD="root";static DataSource dataSource=new MysqlDataSource();public static Connection getConnection() throws SQLException {((MysqlDataSource)dataSource).setUrl(URL);((MysqlDataSource)dataSource).setUser(USERNAME);((MysqlDataSource)dataSource).setPassword(PASSWORD);return dataSource.getConnection();}public static void getClose(Connection connection, PreparedStatement statement, ResultSet resultSet){if(resultSet!=null){try {resultSet.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

d.客戶端代碼

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class UdpClient {String serverIp;int serverPort;DatagramSocket socket=null;public UdpClient(String serverIp,int serverPort) throws SocketException {this.serverIp=serverIp;this.serverPort=serverPort;socket=new DatagramSocket();}public void start() throws IOException {Scanner scanner=new Scanner(System.in);while(true){System.out.println("->");//1.用戶輸入請求,并且構(gòu)造請求String request=scanner.next();if(request.equals("exit")){System.out.println("程序退出");return;}DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);//2.將請求發(fā)送服務(wù)器socket.send(requestPacket);//3.從服務(wù)器接收響應(yīng)DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);String response=new String(responsePacket.getData(),0,responsePacket.getLength());//4.打印日志String log=String.format("[%s,%d]:request:%s,response:%s",responsePacket.getAddress(),responsePacket.getPort(),request,response);System.out.println(log);}}public static void main(String[] args) throws IOException {UdpClient udpClient=new UdpClient("127.0.0.1",9090);udpClient.start();}
}

e.服務(wù)器代碼

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;//服務(wù)器
public class UdpServer {DatagramSocket socket=null;public UdpServer(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("啟動服務(wù)器");while(true){//1.接收請求DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//2.解析請求String request=new String(requestPacket.getData(),0,requestPacket.getLength());//3.構(gòu)造響應(yīng)String response=process(request);DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());//4.給客戶端發(fā)送響應(yīng)socket.send(responsePacket);//打印日志String log=String.format("[%s,%d]:request:%s,response:%s",responsePacket.getAddress(),responsePacket.getPort(),request,response);System.out.println(log);}}public String process(String request){Connection connection=null;PreparedStatement preparedStatement=null;ResultSet resultSet=null;Translate translate=new Translate();try{connection=Util.getConnection();String sql="select * from translate where chinese=?";preparedStatement=connection.prepareStatement(sql);preparedStatement.setString(1,request);resultSet=preparedStatement.executeQuery();if(resultSet.next()){translate.setEnglish(resultSet.getString("english"));}else{String t=new String("詞典中不存在該詞");return t;}}catch(SQLException e){e.printStackTrace();}finally {Util.getClose(connection,preparedStatement,resultSet);}return translate.getEnglish();}public static void main(String[] args) throws IOException {UdpServer server=new UdpServer(9090);server.start();}
}

結(jié)果展示:
數(shù)據(jù)庫:
在這里插入圖片描述
客戶端:在這里插入圖片描述

服務(wù)器:
在這里插入圖片描述

四、TCP流套接字

1.ServerSocket
2.Socket

2.寫一個回顯服務(wù)器
a.客戶端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;//客戶端
public class TcpEchoClient02 {Socket socket=null;String serverIp;int serverPort;public TcpEchoClient02(String serverIp,int serverPort) throws IOException {this.serverIp=serverIp;this.serverPort=serverPort;socket=new Socket(serverIp,serverPort);}public void start(){Scanner in=new Scanner(System.in);System.out.println("客戶端");try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){while(true){System.out.println("->");String request=in.next();//將用戶需求發(fā)送給服務(wù)器PrintWriter printWriter=new PrintWriter(outputStream);printWriter.println(request);printWriter.flush();//接收服務(wù)器發(fā)送的響應(yīng)Scanner scanner=new Scanner(inputStream);if(!scanner.hasNext()){break;}String response=scanner.next();//打印日志String log=String.format("[%s,%d]:request:%s,response:%s",socket.getInetAddress(),socket.getPort(),request,response);System.out.println(log);}} catch (IOException e) {e.printStackTrace();}finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) throws IOException {TcpEchoClient02 tcpEchoClient02=new TcpEchoClient02("127.0.0.1",9090);tcpEchoClient02.start();}
}

b.服務(wù)器

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;//服務(wù)器
public class TcpEchoServer02 {ServerSocket listenSocket=null;public TcpEchoServer02(int port) throws IOException {listenSocket=new ServerSocket(port);}public void start() throws IOException {System.out.println("啟動服務(wù)器");while (true){Socket socket=listenSocket.accept();processConnection(socket);}}public void processConnection(Socket socket){String log2=String.format("[%s,%d]",socket.getInetAddress(),socket.getPort());System.out.println(log2+"服務(wù)器連接成功");try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){while(true){Scanner scanner=new Scanner(inputStream);if(!scanner.hasNext()){String log=String.format("[%s,%d]",socket.getInetAddress(),socket.getPort());System.out.println(log+"客戶端下線");break;}String request=scanner.next();String response=process(request);PrintWriter printWriter=new PrintWriter(outputStream);printWriter.println(response);printWriter.flush();//打印日志String log=String.format("[%s,%d]:request:%s,response:%s",socket.getInetAddress(),socket.getPort(),request,response);System.out.println(log);}} catch (IOException e) {e.printStackTrace();}finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}public String process(String request){return request;}public static void main(String[] args) throws IOException {TcpEchoServer02 tcpEchoServer02=new TcpEchoServer02(9090);tcpEchoServer02.start();}
}

結(jié)果展示:
客戶端:
在這里插入圖片描述
服務(wù)器:
在這里插入圖片描述

上面的代碼存在一個問題:
在同一時間只能支持一個客戶端去訪問一個服務(wù)器。
如果想要代碼實(shí)現(xiàn)在同一時間內(nèi)多個客戶端訪問一個服務(wù)器,該如何實(shí)現(xiàn)呢?
引入 多進(jìn)程
只需要修改服務(wù)器代碼模塊

多線程下的服務(wù)器代碼

idea編譯器端默認(rèn)一個類只能啟動一次,多個客戶端需要多次啟動客戶端代碼,所以,需要更改編譯器的設(shè)置:
在這里插入圖片描述
在這里插入圖片描述

多線程—服務(wù)器端的代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;//多線程回顯服務(wù)器
public class TcpThreadEchoServer {ServerSocket listenSocket=null;public TcpThreadEchoServer(int port) throws IOException {listenSocket=new ServerSocket(port);}public void start() throws IOException {System.out.println("啟動服務(wù)器");while(true){Socket clientSocket=listenSocket.accept();Thread t=new Thread(){@Overridepublic void run(){processConnection(clientSocket);}};t.start();}}public void processConnection(Socket clientSocket){String log=String.format("[%s,%d]",clientSocket.getInetAddress(),clientSocket.getPort());System.out.println(log+"客戶端上線");try(InputStream inputStream=clientSocket.getInputStream();OutputStream outputStream=clientSocket.getOutputStream()){while(true){Scanner scanner=new Scanner(inputStream);if(!scanner.hasNext()){log=String.format("[%s,%d]",clientSocket.getInetAddress(),clientSocket.getPort());System.out.println(log+"下線");break;}String request=scanner.next();String response=process(request);PrintWriter printWriter=new PrintWriter(outputStream);printWriter.println(response);printWriter.flush();log=String.format("[%s,%d]:request:%s,response:%s",clientSocket.getInetAddress(),clientSocket.getPort(),request,response);System.out.println(log);}} catch (IOException e) {e.printStackTrace();}}public String process(String request){return request;}public static void main(String[] args) throws IOException {TcpThreadEchoServer tcpThreadEchoServer=new TcpThreadEchoServer(9090);tcpThreadEchoServer.start();}
}

上面代碼涉及到線程的創(chuàng)建和銷毀,頻繁的創(chuàng)建和銷毀線程,開銷會比較大,所以,引入了線程池.
服務(wù)器端的代碼需要進(jìn)行改變

線程池—服務(wù)器端的代碼

//線程池---回顯服務(wù)器
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;//線程池--回顯服務(wù)器
public class TcpThreadPoolServer {ServerSocket listenSocket=null;public TcpThreadPoolServer(int port) throws IOException {listenSocket=new ServerSocket(port);}public void start() throws IOException {System.out.println("啟動服務(wù)器");while (true) {Socket socket=listenSocket.accept();//--------------------線程池---------------------------ExecutorService executorService= Executors.newCachedThreadPool();executorService.submit(new Runnable(){@Overridepublic void run(){processConnection(socket);}});}}public void processConnection(Socket socket){String log=String.format("【%s,%d】:客戶端上線了",socket.getInetAddress(),socket.getPort());System.out.println(log);try(InputStream inputStream=socket.getInputStream();OutputStream outputstream=socket.getOutputStream()){while(true){Scanner scanner=new Scanner(inputStream);if(!scanner.hasNext()){log=String.format("[%s,%d]",socket.getInetAddress(),socket.getPort());System.out.println(log+"客戶下線");break;}String request=scanner.next();String response=process(request);PrintWriter printWriter=new PrintWriter(outputstream);printWriter.println(response);printWriter.flush();log=String.format("[%s,%d]:request:%s,response:%s",socket.getInetAddress(),socket.getPort(),request,response);System.out.println(log);}} catch (IOException e) {e.printStackTrace();}finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}public String process(String request){return request;}public static void main(String[] args) throws IOException {TcpThreadPoolServer tcpThreadPoolServer=new TcpThreadPoolServer(9090);tcpThreadPoolServer.start();}
}

結(jié)果:客戶端1:
在這里插入圖片描述

客戶端2:
在這里插入圖片描述
服務(wù)器:
在這里插入圖片描述

場景:在某些時刻,服務(wù)器會收到很多個請求,服務(wù)器收到多個請求,需要創(chuàng)建多個線程,當(dāng)請求過多的時候,服務(wù)器資源(eg:CPU,內(nèi)存資源)不夠用,服務(wù)器最后會崩潰。該如何解決在某些時刻,服務(wù)器收到多個請求這種場景呢?
1.引入?yún)f(xié)程。協(xié)程比線程更輕量;
2.IO多路復(fù)用;
3.引入多個服務(wù)器。

3.利用tcp流套接字寫一個"翻譯器"–“漢譯英”—連接數(shù)據(jù)庫

數(shù)據(jù)庫和數(shù)據(jù)表的創(chuàng)建,和上面基于UDP的套接字實(shí)現(xiàn)方法是一樣的。
只是客戶端和服務(wù)器端的socket不一樣。

a.客戶端代碼

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;//翻譯器--客戶端
public class TcpClient {Socket socket=null;String serverIp;int port;public TcpClient(String serverIp,int port) throws IOException {this.serverIp=serverIp;this.port=port;socket=new Socket(serverIp,port);}public void start(){Scanner in=new Scanner(System.in);try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){while(true){System.out.println("->");String request=in.next();if(request.equals("exit")){break;}PrintWriter printWriter=new PrintWriter(outputStream);printWriter.println(request);printWriter.flush();Scanner scanner=new Scanner(inputStream);if(!scanner.hasNext()){break;}String response=scanner.next();String log=String.format("【%s,%d】:request:%s,response:%s",socket.getInetAddress(),socket.getPort(),request,response);System.out.println(log);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpClient tcpClient=new TcpClient("127.0.0.1",9090);tcpClient.start();}
}

b.服務(wù)器端代碼

import test0209.util.DBUtil;
import test0209.util.Translate;import javax.xml.transform.Result;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;//翻譯器--服務(wù)器
public class TcpServer {ServerSocket listenSocket=null;public TcpServer(int port) throws IOException {listenSocket=new ServerSocket(port);}public void start() throws IOException {System.out.println("啟動服務(wù)器");while(true){Socket socket=listenSocket.accept();ExecutorService executorService= Executors.newCachedThreadPool();executorService.submit(new Runnable() {@Overridepublic void run() {processConnection(socket);}});}}public void processConnection(Socket socket){String log=String.format("[%s,%d]",socket.getInetAddress(),socket.getPort());System.out.println(log+"客戶端上線");try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){while(true){Scanner scanner=new Scanner(inputStream);if(!scanner.hasNext()){log=String.format("[%s,%d]",socket.getInetAddress(),socket.getPort());System.out.println(log+"客戶端下線");break;}String request=scanner.next();String response=process(request);PrintWriter printWriter=new PrintWriter(outputStream);printWriter.println(response);printWriter.flush();log=String.format("[%s,%d]:request:%s,response:%s",socket.getInetAddress(),socket.getPort(),request,response);System.out.println(log);}} catch (IOException e) {e.printStackTrace();}}//翻譯器public String process(String request){Connection connection=null;PreparedStatement preparedStatement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select * from translate where chinese=?";preparedStatement=connection.prepareStatement(sql);preparedStatement.setString(1,request);resultSet=preparedStatement.executeQuery();if(!resultSet.next()){String log=new String("詞典中不存在該詞語");return log;}Translate translate=new Translate();translate.setEnglish(resultSet.getString("english"));return translate.getEnglish();} catch (SQLException throwables) {throwables.printStackTrace();}return new String("沒有查到");}public static void main(String[] args) throws IOException {TcpServer tcpServer=new TcpServer(9090);tcpServer.start();}
}

結(jié)果截圖:
客戶端1:
在這里插入圖片描述
客戶端2:
在這里插入圖片描述

服務(wù)器:
在這里插入圖片描述

http://www.risenshineclean.com/news/8689.html

相關(guān)文章:

  • 眉山手機(jī)網(wǎng)站建設(shè)每天4元代發(fā)廣告
  • 廣州建設(shè)工程交易中心改版seo推廣公司排名
  • 麗水專業(yè)網(wǎng)站建設(shè)價格手機(jī)百度下載安裝
  • 建設(shè)銀行忘記密碼網(wǎng)站網(wǎng)站關(guān)鍵詞快速排名優(yōu)化
  • 保健品網(wǎng)站怎么做的如何找友情鏈接
  • 小面網(wǎng)站建設(shè)搜索引擎優(yōu)化方式
  • 網(wǎng)站引導(dǎo)動畫深圳網(wǎng)絡(luò)營銷推廣
  • 企業(yè)網(wǎng)站建設(shè)程序網(wǎng)站建設(shè)推廣
  • 做網(wǎng)站 創(chuàng)業(yè) 流程網(wǎng)絡(luò)銷售就是忽悠人
  • 品牌官方網(wǎng)站網(wǎng)絡(luò)營銷的策劃流程
  • 中國建設(shè)銀行巴黎分行網(wǎng)站武漢網(wǎng)站制作
  • 醫(yī)療網(wǎng)站優(yōu)化最好用的免費(fèi)建站
  • 新手學(xué)做網(wǎng)站72小時精選廈門網(wǎng)絡(luò)營銷推廣
  • 昆明市建設(shè)局網(wǎng)站百度的網(wǎng)站
  • google站長工具刷百度關(guān)鍵詞排名
  • 專業(yè)網(wǎng)站開發(fā)報價seo綜合查詢國產(chǎn)
  • 網(wǎng)站建設(shè)氺首選金手指142022最新國內(nèi)新聞50條簡短
  • wordpress做外貿(mào)網(wǎng)站站長工具之家seo查詢
  • 齊齊哈爾做網(wǎng)站搜狗seo
  • 鄭州網(wǎng)站建設(shè)老牌公司網(wǎng)絡(luò)營銷步驟
  • 找個做微商授權(quán)網(wǎng)站黑科技引流工具
  • 山西路橋建設(shè)集團(tuán)有限公司網(wǎng)站驚艷的網(wǎng)站設(shè)計(jì)
  • 做網(wǎng)站是怎么回事國內(nèi)免費(fèi)推廣產(chǎn)品的網(wǎng)站
  • 泉州企業(yè)建站系統(tǒng)南寧排名seo公司
  • 求邯鄲網(wǎng)站制作搜索引擎排名優(yōu)化方案
  • pc網(wǎng)站原型設(shè)計(jì)工具河南平價的seo整站優(yōu)化定制
  • 別墅室內(nèi)設(shè)計(jì)網(wǎng)站寧波關(guān)鍵詞優(yōu)化企業(yè)網(wǎng)站建設(shè)
  • 網(wǎng)站開發(fā)中網(wǎng)頁之間的鏈接形式有模板建站流程
  • 哪個協(xié)會要做網(wǎng)站建設(shè)啊優(yōu)化網(wǎng)站快速排名軟件
  • 鄭州市哪里有網(wǎng)站建設(shè)河南網(wǎng)站排名優(yōu)化