天天看點

Java網絡程式設計TCP 、建立Socket連接配接,用戶端和服務端基本資料傳輸

1.Java網絡程式設計——建立Socket連接配接

基于Tcp協定的程式設計:

服務端和用戶端

服務端:建立ServerSocket對象,綁定要監聽的端口。

用戶端:建立Socket(網絡套接字),給出要通路的服務端ip,以及端口号port。

下面給出一段代碼示範

服務端代碼示例

package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mysever {

	public static void main(String[] args) throws IOException {
		
		//建立服務端對象,綁定4574端口。
		 ServerSocket serv =new ServerSocket(4574);
		 
		 System.out.println("伺服器啟動成功,等待使用者接入");
		  
		 //accept()等待使用者接入,如果沒有使用者連接配接,會一直等待。
		 //有客戶連接配接後,accept()方法會傳回一個Socket對象,代表用戶端
		 Socket sc=serv.accept();
		 
		 System.out.println("有用戶端接入,用戶端ip:"+sc.getInetAddress());
	}
}
           

用戶端代碼示例

package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mysever {

	public static void main(String[] args) throws IOException {
		
		//建立服務端對象,綁定4574端口。
		 ServerSocket serv =new ServerSocket(4574);
		 
		 System.out.println("伺服器啟動成功,等待使用者接入");
		  
		 //accept()等待使用者接入,如果沒有使用者連接配接,會一直等待。
		 //有客戶連接配接後,accept()方法會傳回一個Socket對象,代表用戶端
		 Socket sc=serv.accept();
		 
		 System.out.println("有用戶端接入,用戶端ip:"+sc.getInetAddress());
	}
}
           

先運作服務端代碼,再運作用戶端代碼。

運作服務端(用戶端還未運作)

伺服器啟動成功,等待使用者接入

運作用戶端

伺服器啟動成功,等待使用者接入

有用戶端接入,用戶端ip:/192.168.0.104

切換到服務端控制視窗

服務端結果

伺服器啟動成功,等待使用者接入

有用戶端接入,用戶端ip:/192.168.0.104

2.Socket基本流資料傳輸(用戶端和服務端進行資料傳輸的基本操作)

getInputStream():傳回網絡輸入流InputStream,可以接收來自網絡的資料

getOutputStream():傳回值為網絡輸出流 OutputStream,可以将資料發送到網絡上

write(byte[]):寫

read(byte[]):讀

服務端代碼

package server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Mysever {

	public static void main(String[] args) throws IOException {
		
		//建立服務端對象,綁定4574端口。
		 ServerSocket serv =new ServerSocket(4574);
		 
		 System.out.println("伺服器啟動成功,等待使用者接入");
		  
		 //accept()等待使用者接入,如果沒有使用者連接配接,會一直等待。
		 //有客戶連接配接後,accept()方法會傳回一個Socket對象,代表用戶端
		 Socket sc=serv.accept();
		 
		 System.out.println("有用戶端接入,用戶端ip:"+sc.getInetAddress());
		 
		 //從Socket中得到網絡輸入流,接收來自網絡的資料
		 InputStream in=sc.getInputStream();
		 //從Socket中得到網絡輸出流,将資料發送到網絡上
		 OutputStream out=sc.getOutputStream();
	
		 //接收用戶端發來的資料
		 byte[] bs=new byte[1024];
		 //将資料存入bs數組中,傳回值為數組的長度
		 int len=in.read(bs);
		 String str=new String(bs,0,len);
		 System.out.println("來自用戶端的消息: "+str);
		 
		 //向用戶端寫資料,注意用戶端代碼中别忘記寫read()方法,否則會抛異常
		 out.write("歡迎通路,你好,我是服務端".getBytes());	 
		 System.out.println("服務端正常結束");
		 
		 //關閉流!
		 sc.close();		 
	}
}
           

用戶端代碼

package cli;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 下面編寫用戶端,此時,不需要關心用戶端位址。
 * 隻需要關心服務端ip位址,這樣才能連接配接伺服器。
 * 服務端的端口号也需要知道。
 * 
 */
public class MyClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		//建立Socket連接配接,new Socket(服務端ip,端口port);
		Socket so=new Socket("192.168.0.104",4574);
		
		System.out.println("連接配接伺服器成功");
		
	   //從Socket中得到網絡輸入流,接收來自網絡的資料
		InputStream in=so.getInputStream();
	   //從Socket中得到網絡輸出流,将資料發送到網絡上
		OutputStream out=so.getOutputStream();
		
		//write方法中隻能為byte[],或者int。
		//若服務端沒有read(),則用戶端會一直等。即停留在write方法中。
		out.write("你好,我是用戶端".getBytes());
		
		 //接收服務端發來的資料
		 byte[] bs=new byte[1024];
		 //将資料存入bs數組中,傳回值為數組的長度
		 int len=in.read(bs);
		 String str=new String(bs,0,len);
		 System.out.println("來自服務端的消息: "+str);
		//關閉流
		 so.close();
	}
}
           

用戶端運作結果

連接配接伺服器成功

來自服務端的消息: 歡迎通路,你好,我是服務端

服務端運作結果

伺服器啟動成功,等待使用者接入

有用戶端接入,用戶端ip:/192.168.0.104

來自用戶端的消息: 你好,我是用戶端

服務端正常結束