Java網絡編程——實現簡單的網絡聊天室(TCP和UDP兩種方式)

Socket使用的TCP連接,需要先連接之後才能發送數據。

DatagramSocket使用的UDP連接,客戶端不需要先連接數據,可以直接發送給指定服務端。

使用UDP協議

發送端:

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 
 * @author Administrator
 * 發送端
 */
public class TestSend {

	public static void main(String[] args) {
		try {
			//1.創建自己的套接字(8000以後)—— DatagramSocket
			DatagramSocket client = new DatagramSocket();
			//2.發送內容
			Scanner sc = new Scanner(System.in);
			System.out.println("輸入發送的內容:");
			String msg = sc.nextLine();
			//3.打包
			//創建一個IP對象
			InetAddress adds = InetAddress.getByName("192.168.1.105");
			DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length ,adds,12306);
			//4.發送包
			client.send(packet);
                   client.close();
		} catch (SocketException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
	}

}

 接收端

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 
 * @author Administrator
 * 接收端
 */
public class TestRec {

	public static void main(String[] args) {
		
		try {
			//1.創建自己的套接字(8000以後)—— DatagramSocket
			DatagramSocket server = new DatagramSocket(9998);
			//2.準備接收容器
			byte []buf = new byte[1024];
			//3.封裝成包裹 —— DatagramPacket
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			//3.讀取的過程,分析數據
			server.receive(packet);
			System.out.println("對方IP:"+packet.getAddress());
			System.out.println("對方發送的數據:"+new String(packet.getData()));
		} catch (SocketException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} 	
		
	}
}

使用TCP協議

發送端

package socketTCP;

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

/**
 * TCP協議,客戶端(發送端)
 * @author Administrator
 *
 */
public class Client {

	public static void main(String[] args) throws IOException {
		//創建套接字,連接服務器端IP和端口
		Socket client = new Socket("192.168.1.107",10087);
		//創建輸出流
		OutputStream output = client.getOutputStream();
		//創建要發送的內容
		String msg = "Hello World!";
		//發送數據,先將字符創裝換成字節
		output.write(msg.getBytes());
  
           //接收對方回覆
		//創建輸入流
		InputStream input = client.getInputStream();
		byte buf[] = new byte[1024];
		int len = input.read(buf);
		System.out.println("接收到的回覆:"+new String(buf,0,len));
	}

}

接收端

package socketTCP;

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

/**
 * TCP協議,服務器端(接收端)
 * @author Administrator
 *
 */
public class Server {

	public static void main(String[] args) {
		try {
			//創建套接字
			ServerSocket server = new ServerSocket(8888);
			//創建監聽,等待客戶端的連接,並得到客戶端的套接字
			Socket client = server.accept();
			//獲取輸入流
			InputStream input = client.getInputStream();
			//創建存放數據的數組
			byte buf[] = new byte[1024];
			//從流中讀取數據到數組中,並獲取讀取的長度
			int len = input.read(buf);
			//判斷是否讀取成功
			if (len != -1) { //讀取成功
				
				System.out.println("對方IP:"+client.getInetAddress());
				System.out.println("對方發送的數據:"+ new String(buf, 0,len));
			}
			OutputStream output = client.getOutputStream();
			System.out.println("回覆對方");
			String msg = "Hello World too!";
			output.write(msg.getBytes());
			
	    } catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章