1. 程式人生 > >網路程式設計概念。一個UDP構造的聊天室

網路程式設計概念。一個UDP構造的聊天室

網路程式設計:利用網路將不同計算機資料進行交換

網路三要素:

IP地址   +   埠 =Socket

協議 :UDP,TCP     

inetAddress類的使用

public class InetAddressDemo {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		InetAddress address = InetAddress.getByName("");
		System.out.println(address.getHostAddress());
		System.out.println(address.getHostName());
		InetAddress localHost = InetAddress.getLocalHost();
		System.out.println(localHost);
	}

}
用本機名和本機地址

UDP和TCP協議

UDP:將資料來源和目的封裝在資料包中,不需要建立連線,每個資料包大小在64K內,無連線,是不可靠協議,但是速度很快。

TCP:建立連線,形成傳輸資料的通道,在連線中進行大資料量的傳輸;通過三次握手完成連線,是可靠協議,但是效率會稍低。

Socket:應用層和傳輸層之間的橋樑。下面的底層已經封裝好了,我們只需要用Socket進行操作就行了。

Socket原理機制:

通訊的兩端都有Socket

網路通訊其實就是Socket間的通訊

資料在兩個Socket之間通過IO傳輸

UDP傳輸伺服器端編寫

public class Server {

	public static void main(String[] args) throws Exception {
//		建立一個服務端Socket並監聽指定埠
		DatagramSocket ds = new DatagramSocket(8888);
//		接收資料,並將資料放在資料包中
		byte[] buf =new byte[64*1024];
		int length = buf.length;
		DatagramPacket p = new DatagramPacket(buf, length);
		ds.receive(p);
//		將包中的資料取出來
		byte[] data=p.getData();//獲取的是接受到的資料
		InetAddress address = p.getAddress();//接受傳送過來的主機地址
		int port = p.getPort();//獲取埠號
		String ip = address.getHostAddress();//獲取的是客戶端的ip地址
		int dataLength = p.getLength();
//		將資料轉換成字串
		String result = new String(data,0,dataLength);
		System.out.println("ip="+ip+",port="+port+",result="+result);
//		關閉資源
		ds.close();
	}

}

UDP客戶端客戶端編寫

public class Client {

	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket();
		byte[] buf = "UDP傳送訊息".getBytes();//包資料
		int length=buf.length;//包長度
		InetAddress address=InetAddress.getByName("127.0.0.1");//目的地址
		int port=8888;//目的埠號
		DatagramPacket p=new DatagramPacket(buf, length, address, port);
		// 呼叫Socket的傳送方法
		ds.send(p);
		ds.close();
	}

}

l聊天室初級版客戶端

public class Client {

	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket();
		InetAddress address = InetAddress.getByName("127.0.0.1");
		Scanner sc = new Scanner(System.in);
		String line;
		while (!(line = sc.nextLine()).equals("886")) {
			byte[] buf = line.getBytes();
			DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 8888);
			ds.send(packet);
		}
		ds.close();
	}
}
伺服器端
public class Server {

	public static void main(String[] args) throws Exception {
		DatagramSocket socket = new DatagramSocket(8888);
//		迴圈接受客戶端傳送的內容
		byte[] buf=new byte[64*1024];
		while(true){
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			//接受客戶端資料並存儲到包中
			socket.receive(packet);
//			從資料包中取出內容
			byte[] data = packet.getData();
			int length = packet.getLength();
			String ip = packet.getAddress().getHostAddress();
//			將位元組陣列的形式內容轉化成字串
			String result = new String(data,0,length);
			System.out.println("ip="+ip+",result="+result);
		}
	}

}

注意點:伺服器端建立Socket直接帶埠號

如何和在一個介面上?

運用執行緒。讓這倆個程式執行在同一個主執行緒內。

此時會報錯。Command+option+z,try...catch一下。第一個意思是分別catch,第二個是 catch所有的Exception。

一個完整的UDP聊天室

客戶端

public class ClientRunnable implements Runnable {

	private String ip;
	private int port;

	public ClientRunnable(String ip, int port) {
		this.ip = ip;
		this.port = port;
	}

	@Override
	public void run() {
		DatagramSocket ds = null;
		try {
			ds = new DatagramSocket();
			InetAddress address = InetAddress.getByName(ip);
			Scanner sc = new Scanner(System.in);
			String line;
			while (!(line = sc.nextLine()).equals("886")) {
				byte[] buf = line.getBytes();
				DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
				ds.send(packet);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (ds != null) {
				ds.close();
			}
		}
	}
}
伺服器端
public class ServerRunnable implements Runnable {

	private int port;

	public ServerRunnable(int port) {
		this.port = port;
	}

	@Override
	public void run() {
		try {
			DatagramSocket socket = new DatagramSocket(port);
//		迴圈接受客戶端傳送的內容
			byte[] buf=new byte[64*1024];
			while(true){
				DatagramPacket packet = new DatagramPacket(buf, buf.length);
				//接受客戶端資料並存儲到包中
				socket.receive(packet);
//			從資料包中取出內容
				byte[] data = packet.getData();
				int length = packet.getLength();
				String ip = packet.getAddress().getHostAddress();
//			將位元組陣列的形式內容轉化成字串
				String result = new String(data,0,length);
				System.out.println("ip="+ip+",result="+result);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
主程式
public class ChatRoom {

	public static void main(String[] args) {
//		先啟動服務端聊天執行緒,再啟動客戶端聊天執行緒
		ClientRunnable clientRunnable = new ClientRunnable("127.0.0.1",8888);
		ThreadPoolUtils.execute(clientRunnable);
		ServerRunnable serverRunnable = new ServerRunnable(8888);
		ThreadPoolUtils.execute(serverRunnable);
	}

}
執行緒池
public class ThreadPoolUtils {
	private static ExecutorService threadpool = Executors.newCachedThreadPool();

	public static void execute(Runnable command) {
		threadpool.execute(command);
	}
}

相關推薦

網路程式設計概念一個UDP構造聊天

網路程式設計:利用網路將不同計算機資料進行交換 網路三要素: IP地址   +   埠 =Socket 協議 :UDP,TCP      inetAddress類的使用public class InetAddressDemo { public static void m

Python網路程式設計----實現簡單的多人聊天

還是用UDP,socket作為主體來實現,之前我們已經實現過單對單socket通訊,這次想實現群發功能 原理其實就是一臺伺服器在負責分配轉發資料,來達成廣播的效果,這些思路其實也差不多 但是多人聊天沒有這麼強的規整性,你可能沒等到A的訊息,就要去和B說話了,多執行緒就可以

python網路程式設計udp聊天

import socket def main(): #建立套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.bind(("192.168.227.129",7567

Android網路程式設計之搭建一個屬於你自己的簡單servlet服務端

部署一個自己的一個簡單servlet服務端有以下幾步: 1.jdk的安裝就不說啦。這裡我們將演示的是在Eclipse裡面釋出專案,要想釋出一個專案,首先我們要有一個tomcat,去官網下載或者百度都可以,下載好之後解壓到任意目錄,然後再eclipse裡面進行配

Socket網路程式設計(二)UDP協議實現聊天工具

package UDP_chat; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import jav

網路基本概念之TCP, UDP, 單播(Unicast), 多播(組播)(Multicast)

這篇文章相當低階,但相當重要! 我們周圍一切幾乎都依賴於把事情抽象成低等級,並在某一點把它具體化,在一些設計概念中,介面層十分清晰並且目標很集中,應用程式不用考慮作業系統如何工作,作業系統也不用考慮硬體如何工作,OSI模型的第4層不需要考慮第三層如何工作。所以我們只需要集中精力在某一

1、【網路程式設計】Socket/TCP/UDP/HTTP/HTTPS/網路分層模型

一、簡介 1、相關概念     TCP:傳送控制協議(Transmission Control Protocol)     UDP:使用者資料報協議 (UDP:User Datagram Protocol)     HTTP:全稱是HyperText Transfer Pro

#python 網路程式設計之TCP半雙工聊天小練習

1.建立TCP伺服器端 from socket import *  #匯入相應的模組 HOST = ''   #主機名 POST = 21567  #埠 BUFSIZ = 1024  #設定緩衝區大小 ADDR = (HOST , POST) tcpSerS

網路程式設計協議(TCP和UDP協議,粘包問題)

網路程式設計協議 1.osi七層模型 應用層  表示層  會話層  傳輸層  網路層  資料鏈路層  物理層 2.套接字 socket  有兩類,一種基於檔案型別,一種基於網路型別 3.Tcp和udp協議 Tcp協議:面向連線,

網路程式設計協議(TCP和UDP協議,黏包問題)以及socketserver模組

網路程式設計協議 1.osi七層模型 應用層  表示層  會話層  傳輸層  網路層  資料鏈路層  物理層 2.套接字 socket  有兩類,一種基於檔案型別,一種基於網路型別 3.Tcp和udp協議 Tcp協議:面向連線,

JAVA_ 網路程式設計,寫一個可以上傳檔案的伺服器和客戶端

服務端 class Server { public static void main(String[] args) throws Exception { //建立服務端Socket ServerS

網路基本概念之TCP, UDP, 單播(Unicast), 組播(Multicast)

這篇文章相當低階,但相當重要! 我們周圍一切幾乎都依賴於把事情抽象成低等級,並在某一點把它具體化,在一些設計概念中,介面層十分清晰並且目標很集中,應用程式不用考慮作業系統如何工作,作業系統也不用考慮硬體如何工作,OSI模型的第4層不需要考慮第三層如何工作。所以我們只需要集中精力在某一層,就當下面的層正常

Linux__網路程式設計套接字(UDP/TCP)

重點知識:          ·IP地址、埠號、網路位元組序的基本概念          ·socket api的基本用法          ·實現簡單的UDP客戶端/伺服器          ·實現簡單的TCP客戶端/伺服器(單鏈接版本,多程序版本,多執行緒版本)     

[網路程式設計]TCP協議和UDP協議的區別

TCP協議與UDP協議的區別首先咱們弄清楚,TCP協議和UCP協議與TCP/IP協議的聯絡,很多人犯糊塗了,一直都是說TCP/IP協議與UDP協議的區別,我覺得這是沒有從本質上弄清楚網路通訊!TCP/IP協議是一個協議簇。裡面包括很多協議的。UDP只是其中的一個。之所以命

C 基於UDP實現一個簡易的聊天

引言 本文是圍繞Linux udp api 構建一個簡易的多人聊天室.重點看思路,幫助我們加深 對udp開發中一些api瞭解.相對而言udp socket開發相比tcp socket開發注意的細節要少很多. 但是水也很深. 本文就當是一個demo整合幫助開發者回顧和繼續瞭解

使用ASP.NET SignalR實現一個簡單的聊天

spl 記錄 歷史 undefine reat 語句 關鍵字 pda name  前言   距離我寫上一篇博客已經又過了一年半載了,時間過得很快,一眨眼,就把人變得滄桑了許多。青春是短暫的,知識是無限的。要用短暫的青春,去學無窮無盡的知識,及時當勉勵,歲月不待人。今天寫個隨

一個PWA程式-聊天

本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創首發。 好久沒寫部落格了, 為了治療懶癌, 今天我們來學習一下Google的Progressive Web App, 什麼是Progressive Web App(簡稱PWA)? 文件上有這

利用socket.io搭建一個簡易的聊天

前言 本篇介紹使用node.js模組元件socket.io實現一個非常非常簡易的聊天案例。 本系列文章不對 socket.io 歷史背景做過多闡述,只會通過一個個的案例帶領大家進入socket.io的殿堂,增進小夥伴在socket.io實際開發中的基本使用。 socket.

Netty - 一個簡單的聊天小專案

經過一段時間對Netty的學習,我們對Netty各版本以及像ProtocolBuffers等技術應用都有了不少相關的瞭解, 我們就用這段時間學到的只是做一個簡單的聊天室的小專案來練習自己學到的技術。 做這個小專案之前我們先大致瞭解下我們需要用到的技術點,netty3.x/4.x/5.

基於node.js打造一個簡易的聊天

1.先寫服務端的程式碼 在服務端要先進行安裝node環境,然後用npm install socket.io 要安裝express框架 let http = require('http'); let fs = require('fs'); let ws = require('socket.