TCP
客戶端
先創建socket對象建立tcp客戶端,明確服務端的地址和端口,必須與服務端對應,要不然對方收不到消息,就像快遞填錯了送貨地址。
Socket s = new Socket("127.255.255.25", 10003);
然後建立起連接通道後就會出現socket的IO流,作爲客戶端我們是發送數據的,我們將數據發送到服務端讓它去處理,所以我們獲取的也就是OutPutStream,就是將數據寫給服務端
OutputStream out = s.getOutputStream();
然後剩下的就是給服務端寫數據了,這些操作其實就和IO流那塊一樣了,比如我們下面這樣
out.write("hello,TCP來了".getBytes());
最後一定記得關閉socket資源
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws IOException, IOException {
System.out.println("客戶端運行。。。");
/**
* 需求:通過tcp傳輸數據發送給服務器
* 思路:
* 1、建立tcp客戶端socket.明確服務端的地址和端口
* 2、如果通道建立成功就會出現socket io流
* 客戶端需要做的就是獲取socket流中輸出流將數據發送目的地服務端
* 3、通過socket輸出流將數據發送
* 4、關閉
*/
//1、建立tcp客戶端socket.明確服務端的地址和端口
Socket s = new Socket("127.255.255.25", 10003);
//2、如果通道建立成功就會出現socket io流 客戶端需要做的就是獲取socket流中輸出流將數據發送目的地服務端
//3、通過socket輸出流將數據發送
OutputStream out = s.getOutputStream();
out.write("hello,TCP來了".getBytes());
//4、關閉
s.close();
}
}
當你給服務端發送完數據後,有可能服務端還會給你回覆一些數據,這時候在客戶端還需要去接收服務端發送來的數據,只需要
InputStream in = s.getInputStream();
獲取讀取流,然後像IO流一樣操作就可以讀取返回的數據了
package tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient2 {
public static void main(String[] args) throws IOException{
System.out.println("客戶端2 run...");
/**
* 案例二:實現客戶端和服務端的收發過程
*/
//創建客戶端socket對象,明確服務端地址和端口
Socket s = new Socket("127.255.255.25",10009);
//發送數據通過socket輸出流完成
OutputStream out = s.getOutputStream();
out.write("服務端,我來了".getBytes());
//讀取服務器端返回的數據
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len= in.read(buf);
System.out.println(new String(buf,0,len));
// int len = 0;
// while((len = in.read(buf)) != -1)
// {
// System.out.println(new String(buf,0,len));
// }
//關閉資源
s.close();
}
}
服務端
服務端要與客戶端相連接,就必須創建一個服務端Serversocket對象,並明確端口,這個端口必須與客戶端socket連接的端口一致,然後用一個socket對象去接收客戶端的socket
ServerSocket ss = new ServerSocket(10003);//創建服務端的socket。需要明確端口(監聽一個端口),要不然客戶端無法連接
Socket s = ss.accept();//服務端只要獲取到連接過來的客戶端就可以和指定的客戶端通信了
這個接收客戶端的socket對象s裏面封裝了不光數據內容,還有數據來源的主機IP等等信息。
然後獲取流對象,對客戶端發送來的數據進行讀取
InputStream in = s.getInputStream();
接下來就和IO操作一樣,對數據進行處理即可。
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
System.out.println("服務端。。。");
/**
* 需求:獲取客戶端的數據並顯示在屏幕上
*
* 思路:
* 1、創建服務端的socket。需要明確端口(監聽一個端口),要不然客戶端無法連接
* 2、服務端只要獲取到連接過來的客戶端就可以和指定的客戶端通信了
* 3、通過獲取客戶端的讀取流對象讀取客戶端發來的數據
* 33、並顯示在屏幕上
* 5、關閉資源
*/
//1、創建服務端的socket。需要明確端口(監聽一個端口),要不然客戶端無法連接
ServerSocket ss = new ServerSocket(10003);
//2、服務端只要獲取到連接過來的客戶端就可以和指定的客戶端通信了
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
//3、通過獲取客戶端的讀取流對象讀取客戶端發來的數據
InputStream in = s.getInputStream();
//33、並顯示在屏幕上
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf)) != -1)
{
System.out.println(new String(buf, 0, len));
}
//5、關閉資源
s.close();
//ss.close(); 這一般不關
}
}
一般服務端接收到數據之後,它還會給客戶端返回一些反饋信息,我們可以繼續獲取讀寫流,對客戶端進行寫入操作,即反饋信息。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer2 {
public static void main(String[] args) throws IOException {
System.out.println("服務端2 run...");
/**
* 案例二:實現客戶端和服務端的收發過程
* 服務器端
*/
//創建tcp服務端socket明確端口
ServerSocket ss = new ServerSocket(10009);
while(true)
{
//獲取客戶端對象
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"...connected");
//讀取客戶端發送過來的數據
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf); //讀取到數據之前,線程處於阻塞狀態
System.out.println(new String(buf,0,len));
// int len = 0;
// while((len = in.read(buf)) != -1)
// {
// System.out.println(new String(buf,0,len));
// }
//
// System.out.println("阻塞了嗎?");
//給客戶端回饋數據
OutputStream out = s.getOutputStream();
out.write("客戶端。我已收到。哦耶!".getBytes());
//關閉客戶端
s.close();
}
//關閉服務端
//ss.close(); 如果是不斷的獲取客戶端,就不用關閉服務器
}
}
結果演示:
先開啓服務端
服務端收到數據
客戶端收到反饋