026.3 網絡編程 TCP聊天
分為客戶端和服務端,分別進行收發操作
##########################################################################
客戶端:
###思路:
1、建立tcp客戶端服務
1.1因為是面向連接,必須有連接才有通信
1.2在創建客戶端時,就必須明確目的地址和端口
2、一旦連接建立,就有了傳輸數據的通道。就可以在通道中進行數據傳輸,這個傳輸是通過流實現的,是socket io流
3、獲取socket io中的寫動作就可以發送給服務端
###步驟:
1、創建socket對象,明確目的IP和端口
2、通過socket對象的getOutStream方法獲取OutputStream對象
3、通過OutputStream對象寫數據,實現發送
4、關閉socket對象
###代碼: System.out.println("client start"); //1、創建客戶端對象,明確目的和端口 Socket s = new Socket("192.168.10.141",10000); //2、獲取socket流中的輸出流,將數據發送給服務端 OutputStream out = s.getOutputStream(); //3、通過輸出流寫數據 out.write("I miss you".getBytes()); //4、關閉資源 s.close();
####################################################################
服務端:
###思路:
1、創建socket服務器端服務。服務器監聽一個端口
2、獲取客戶端對象
3、獲取客戶端的socket流的讀取流
4、顯示
###步驟:
1、創建ServerSocket服務器對象
2、通過ServerSocket對象的accept方法,獲取客戶端socket對象
3、通過客戶端socket對象的getInetAddress().getHostAddress() 方法獲取ip對象然後獲取ip
4、通過客戶端socket對象的getInputStream方法獲取InputStream對象
5、通過InputStream對象的read方法獲取客戶端發送的數據。
6、關閉客戶端socket對象。
###代碼: System.out.println("服務器啟動。。。"); //1、創建服務器端對象 ServerSocket ss = new ServerSocket(10003); //2、獲取客戶端對象 Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"...connect"); //3、通過客戶端對象獲取socket流的讀取流 InputStream in = s.getInputStream(); byte[] buf = new byte[1024];int len = in.read(buf); String str = new String(buf,0,len); System.out.println(str); s.close();
################################################################################
簡單互動的TCP通訊
/*### * 案例二:實現客戶端和服務端的收發過程。 * 客戶端 */ System.out.println("客戶端2 啟動......."); // 創建客戶端socket對象。明確服務端地址和端口。 Socket s = new Socket("192.168.1.223", 10004); // 發送數據,通過socket輸出流完成。 OutputStream out = s.getOutputStream(); out.write("服務端,我來了".getBytes()); // 讀取服務端返回的數據,通過socket輸入流 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf,0,len); System.out.println(text); // 關閉資源。 s.close();
/*### * 案例二:實現客戶端和服務端的收發過程。 服務器端。 */ System.out.println("服務端2啟動....."); // 創建tcp服務端socket 明確端口。 ServerSocket ss = new ServerSocket(10004); 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); String text = new String(buf, 0, len); System.out.println(text); // 給客戶端回饋數據。 OutputStream out = s.getOutputStream(); out.write("客戶端,我已到收到,哦耶!".getBytes()); // 關閉客戶端 s.close(); } // 關閉服務端。如果不斷的獲取客戶端,不用關閉服務端。 // ss.close();
###########################################################################
我想寫一個可以多次發送信息的程序,沒有找到哪裏錯了
public class TCPServer2 { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(10005); Socket s = ss.accept(); ServerReceive sr = new ServerReceive(s); ServerSend ssend = new ServerSend(s); new Thread(sr).start(); new Thread(ssend).start(); } } class ServerSend implements Runnable{ private Socket s; private OutputStream os; public ServerSend(Socket s) throws IOException { super(); this.s = s; os = s.getOutputStream(); } @Override public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; try { while((line = br.readLine()) != null){ os.write(line.getBytes()); if("//over".equals(line)){ break; } } s.close(); } catch (IOException e) { } } } class ServerReceive implements Runnable{ private Socket s; private InputStream is; public ServerReceive(Socket s) throws IOException { super(); this.s = s; is = s.getInputStream(); } @Override public void run() { while(true){ byte[] buf = new byte[1024]; try { int len = is.read(buf); String str = new String(buf,0,len); if("//over".equals(str)){ break; } System.out.println(str); s.close(); } catch (IOException e) { } } } }TCPServer
public class TCPClient2 { public static void main(String[] args) throws UnknownHostException, IOException { Socket bothSocket = new Socket("127.0.0.1",10005); Send2 send = new Send2(bothSocket); Receive2 receive = new Receive2(bothSocket); new Thread(send).start(); new Thread(receive).start(); } } //創建發送和接收的類,使用多線程,繼承runnable接口 //多線程發送類 class Send2 implements Runnable{ private Socket s; OutputStream os; public Send2(Socket s) throws IOException { super(); this.s = s; os = s.getOutputStream(); } @Override public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; try { while((line = br.readLine()) != null){ os.write(line.getBytes()); if("//over".equals(line)){ break; } } s.close(); } catch (IOException e) { } } } //多線程接收類 class Receive2 implements Runnable{ private Socket s; private InputStream is; public Receive2(Socket s) throws IOException { super(); this.s = s; } @Override public void run() { while(true){ byte[] buf = new byte[1024]; try { is = s.getInputStream(); int len = is.read(buf); String str = new String(buf,0,len); if("//over".equals(str)){ break; } System.out.println(str); s.close(); } catch (IOException e) { } } } }TCPClient
026.3 網絡編程 TCP聊天