Java ServerSocket和Socket 的網(wǎng)絡(luò)編程
Socket類
Socket(InetAddress address, int port)
創(chuàng)建一個(gè)流套接字并將其連接到指定 IP 地址的指定端口號(hào)狸棍。
Socket(String host, int port)
創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號(hào)涨颜。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
創(chuàng)建一個(gè)套接字并將其連接到指定遠(yuǎn)程地址上的指定遠(yuǎn)程端口。
Socket(String host, int port, InetAddress localAddr, int localPort)
創(chuàng)建一個(gè)套接字并將其連接到指定遠(yuǎn)程主機(jī)上的指定遠(yuǎn)程端口捡鱼。
close()
關(guān)閉此套接字滴铅。
connect(SocketAddress endpoint)
將此套接字連接到服務(wù)器。
connect(SocketAddress endpoint, int timeout)
將此套接字連接到服務(wù)器屯援,并指定一個(gè)超時(shí)值庐橙。
getInetAddress()
返回套接字連接的地址。
getInputStream()
返回此套接字的輸入流。
getLocalPort()
返回此套接字綁定到的本地端口包蓝。
getOutputStream()
返回此套接字的輸出流。
getPort()
返回此套接字連接到的遠(yuǎn)程端口瘾英。
ServerSocket類
ServerSocket(int port)
創(chuàng)建綁定到特定端口的服務(wù)器套接字县爬。
accept()
偵聽并接受到此套接字的連接卷拘。
getInetAddress()
返回此服務(wù)器套接字的本地地址。
Socket編程步驟
服務(wù)器端創(chuàng)建ServerSocket對(duì)象改鲫,調(diào)用accept方法返回Socket對(duì)象
客戶端創(chuàng)建Socket對(duì)象,通過端口連接到服務(wù)器
客戶端锨阿、服務(wù)器端都使用Socket中的getInputStream方法和getOutputStream方法獲得輸入流和輸出流酵使,進(jìn)一步進(jìn)行數(shù)據(jù)讀寫操作
(InetAddress用來描述主機(jī)地址;
Socket用來創(chuàng)建兩臺(tái)主機(jī)之間的連接礁扮;
ServerSocket用來偵聽來自客戶端的請(qǐng)求曙痘;
Socket通常稱作“套接字”罢洲,通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求院究。)
服務(wù)端步驟:
1业汰、創(chuàng)建套接字
2、將套接字綁定到一個(gè)本地地址和端口上鳍怨。
3鞋喇、將套接字設(shè)為監(jiān)聽模式醒串,準(zhǔn)備接受客戶請(qǐng)求膘壶。
4柬赐、等待客戶請(qǐng)求到來贫堰;當(dāng)請(qǐng)求到來之后,接受連接請(qǐng)求压彭,返回一個(gè)新的對(duì)應(yīng)于此次連接的套接字睦优。啟動(dòng)線程為當(dāng)前的連接服務(wù)。
5壮不、返回汗盘,等待另外一個(gè)客戶請(qǐng)求。
6询一、關(guān)閉套接字
客戶端步驟:
1隐孽、創(chuàng)建套接字。
2健蕊、向服務(wù)器發(fā)出連接請(qǐng)求菱阵。
3、和服務(wù)器端進(jìn)行通信缩功。
4晴及、關(guān)閉套接字。
注意: 由于server和client都是接受一行數(shù)據(jù)嫡锌,所以在發(fā)送數(shù)據(jù)的時(shí)候加 "\r\n" 結(jié)束符
ServerSocket示例
package com.lvyuanj.core.java;
import io.netty.util.CharsetUtil;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PlainOioServer {
private final static String END_COMMAND = "\r\n";
private final static String RECEIPINFO ="ACKNOWLEDGE RECEIPT"+ END_COMMAND;
public void initServer(int port) throws Exception {
final ServerSocket socket = new ServerSocket(port);
System.out.println("server start ......");
while (true) {
Socket clientSocket = socket.accept();
System.out.println("Accepted connection from " + clientSocket);
new Thread(new MyThread(clientSocket)).start();
}
}
class MyThread implements Runnable {
private Socket socket;
public MyThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String data = null;
while ((data = reader.readLine()) != null) {
System.out.println("receipt "+socket.getInetAddress()+" client data:" + data);
out.write(RECEIPINFO.getBytes(CharsetUtil.UTF_8));
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception {
PlainOioServer plainOioServer = new PlainOioServer();
plainOioServer.initServer(8899);
}
}
client 示例:
package com.lvyuanj.core.java;
import java.io.*;
import java.net.Socket;
public class PlainOioClient {
private final static String END_COMMAND = "\r\n";
class ReceiptThread implements Runnable{
private Socket socket;
public ReceiptThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
System.out.println("start client console listener:");
//讀取服務(wù)器返回的消息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String str = null;
while((str = br.readLine())!=null){ //阻塞式讀取數(shù)據(jù)
writer.write(str+END_COMMAND);
writer.flush();
if("bye".equals(str)){
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
try{
Socket socket = new Socket("127.0.0.1",8899);
PlainOioClient plainOioClient = new PlainOioClient();
ReceiptThread sendDataThread = plainOioClient.new ReceiptThread(socket);
//從控制獲取數(shù)據(jù)并發(fā)送服務(wù)器線程
new Thread(sendDataThread).start();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String body;
while((body = reader.readLine()) != null){
System.out.println("receipt server data:"+body);
}
}catch (Exception e){
e.printStackTrace();
}
}
}