1. 程式人生 > >Java中UDP、TCP及HTTP通訊

Java中UDP、TCP及HTTP通訊

剛學完ITCast畢老師的視訊,原理不寫在這裡了。

首先,在Java.net包中有表示網際網路協議地址(IP)的類InetAddress,此類沒有建構函式,其對應例項可由其靜態方法

import java.net.*;

class  IPDemo
{
	public static void main(String[] args) throws Exception
	{
		//InetAddress i = InetAddress.getLocalHost();

//		System.out.println(i.toString());
//		System.out.println("address:"+i.getHostAddress());
//		System.out.println("name:"+i.getHostName());

		InetAddress ia = InetAddress.getByName("thinkpad-sl400");
		System.out.println("address:"+ia.getHostAddress());
		System.out.println("name:"+ia.getHostName());

	}
}

UDP通訊

UDP是面向無連線的 ,不安全,單工通訊,但是速度快。QQ,視訊等用的是UDP

import java.net.*;

/*
需求:通過udp傳輸方式,將一段文字資料傳送出去。,
定義一個udp傳送端。
思路:
1,建立updsocket服務。
2,提供資料,並將資料封裝到資料包中。
3,通過socket服務的傳送功能,將資料包發出去。
4,關閉資源。

*/
class  UdpSend
{
	public static void main(String[] args) throws Exception
	{
		//1,建立udp服務。通過DatagramSocket物件。
		DatagramSocket ds = new DatagramSocket(8888);

		//2,確定資料,並封裝成資料包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

		byte[] buf = "udp ge men lai le ".getBytes();
		DatagramPacket dp = 
			new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);

		//3,通過socket服務,將已有的資料包傳送出去。通過send方法。
		ds.send(dp);
		//4,關閉資源。
		ds.close();
	}
}

/*
需求:
定義一個應用程式,用於接收udp協議傳輸的資料並處理的。


定義udp的接收端。
思路:
1,定義udpsocket服務。通常會監聽一個埠。其實就是給這個接收網路應用程式定義數字標識。
	方便於明確哪些資料過來該應用程式可以處理。

2,定義一個數據包,因為要儲存接收到的位元組資料。
因為資料包物件中有更多功能可以提取位元組資料中的不同資料資訊。
3,通過socket服務的receive方法將收到的資料存入已定義好的資料包中。
4,通過資料包物件的特有功能。將這些不同的資料取出。列印在控制檯上。
5,關閉資源。
*/

class  UdpRece
{
	public static void main(String[] args) throws Exception
	{
		//1,建立udp socket,建立端點。
		DatagramSocket ds = new DatagramSocket(10000);
		while(true)
		{
		//2,定義資料包。用於儲存資料。
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf,buf.length);

		//3,通過服務的receive方法將收到資料存入資料包中。
		ds.receive(dp);//阻塞式方法。
		
		//4,通過資料包的方法獲取其中的資料。
		String ip = dp.getAddress().getHostAddress();

		String data = new String(dp.getData(),0,dp.getLength());

		int port = dp.getPort();

		System.out.println(ip+"::"+data+"::"+port);
		}
		//5,關閉資源
		//ds.close();
	}
}

加上鍵盤錄入的(單向通訊)

import java.net.*;
import java.io.*;
class  UdpSend2
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket();//建立UDP物件時,可以像上面繫結埠,也可以預設使用隨機埠

		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));

		String line = null;

		while((line=bufr.readLine())!=null)
		{
			if("886".equals(line))
				break;

			byte[] buf = line.getBytes();

			DatagramPacket dp = 
				new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10001);//傳送至指定IP,指定埠

			ds.send(dp);
		}
		ds.close();//注意關閉資源
	}
}

class  UdpRece2
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(10001);//接收端監聽指定埠

		while(true)
		{
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf,buf.length);

			ds.receive(dp);//上面while(true),此處receive()為阻塞式方法,無接收等待

			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(),0,dp.getLength());
			
			System.out.println(ip+"::"+data);
		}
	}
}
TCP通訊
面向有連線,三次握手,四次揮手(因為全雙工通訊),所以安全,準確。
/*
演示tcp傳輸。

1,tcp分客戶端和服務端。
2,客戶端對應的物件是Socket。
	服務端對應的物件是ServerSocket。

*/

/*
客戶端,
通過查閱socket物件,發現在該物件建立時,就可以去連線指定主機。
因為tcp是面向連線的。所以在建立socket服務時,
就要有服務端存在,並連線成功。形成通路後,在該通道進行資料的傳輸。

需求:給服務端傳送給一個文字資料。

步驟:
1,建立Socket服務。並指定要連線的主機和埠。

*/
import java.io.*;
import java.net.*;
class  TcpClient
{
	public static void main(String[] args) throws Exception 
	{
		//建立客戶端的socket服務。指定目的主機和埠
		Socket s = new Socket("192.168.1.254",10003);
		
		//為了傳送資料,應該獲取socket流中的輸出流。
		OutputStream out = s.getOutputStream();

		out.write("tcp ge men lai le ".getBytes());

		s.close();
	}
}

/*
需求:定義端點接收資料並列印在控制檯上。

服務端:
1,建立服務端的socket服務。ServerSocket();
	並監聽一個埠。
2,獲取連線過來的客戶端物件。
	通過ServerSokcet的 accept方法。沒有連線就會等,所以這個方法阻塞式的。
3,客戶端如果發過來資料,那麼服務端要使用對應的客戶端物件,並獲取到該客戶端物件的讀取流來讀取發過來的資料。
	並列印在控制檯。
4,關閉服務端。(可選)

*/
class  TcpServer
{
	public static void main(String[] args) throws Exception
	{
		//建立服務端socket服務。並監聽一個埠。
		ServerSocket ss = new ServerSocket(10003);

		//通過accept方法獲取連線過來的客戶端物件。
		while(true)
		{
		Socket s = ss.accept();

		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+".....connected");

		//獲取客戶端傳送過來的資料,那麼要使用客戶端物件的讀取流來讀取資料。
		InputStream in = s.getInputStream();
		
		byte[] buf = new byte[1024];
		int len = in.read(buf);

		System.out.println(new String(buf,0,len));

		s.close();//關閉客戶端.
		}
		//ss.close();
	}
}
雙工通訊
import java.io.*;
import java.net.*;
/*
演示tcp的傳輸的客戶端和服務端的互訪。

需求:客戶端給服務端傳送資料,服務端收到後,給客戶端反饋資訊。

*/

/*
客戶端:
1,建立socket服務。指定要連線主機和埠。
2,獲取socket流中的輸出流。將資料寫到該流中。通過網路傳送給服務端。
3,獲取socket流中的輸入流,將服務端反饋的資料獲取到,並列印。
4,關閉客戶端資源。

*/
class TcpClient2 
{
	public static void main(String[] args)throws Exception 
	{
		Socket s = new Socket("192.168.1.254",10004);
		
		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));

		s.close();
	}
}


class TcpServer2
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10004);

		Socket s = ss.accept();

		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"....connected");
		InputStream in = s.getInputStream();

		byte[] buf = new byte[1024];

		int len = in.read(buf);

		System.out.println(new String(buf,0,len));


		OutputStream out = s.getOutputStream();


		Thread.sleep(10000);
		out.write("哥們收到,你也好".getBytes());

		s.close();

		ss.close();
	}
}


用TCP傳送檔案

import java.io.*;
import java.net.*;

class  TextClient
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("192.168.1.254",10006);

		BufferedReader bufr = 
			new BufferedReader(new FileReader("IPDemo.java"));

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);


		String line = null;
		while((line=bufr.readLine())!=null)
		{
			out.println(line);
		}

		s.shutdownOutput();//關閉客戶端的輸出流。相當於給流中加入一個結束標記-1.

		BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

		String str = bufIn.readLine();
		System.out.println(str);

		bufr.close();

		s.close();
	}
}
class  TextServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10006);

		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"....connected");


		BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

		PrintWriter out  = new PrintWriter(new FileWriter("server.txt"),true);

		String line = null;

		while((line=bufIn.readLine())!=null)
		{
			//if("over".equals(line))
				//break;
			out.println(line);
		}

		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		pw.println("上傳成功");

		out.close();
		s.close();
		ss.close();

	}
}



相關推薦

JavaUDPTCPHTTP通訊

剛學完ITCast畢老師的視訊,原理不寫在這裡了。 首先,在Java.net包中有表示網際網路協議地址(IP)的類InetAddress,此類沒有建構函式,其對應例項可由其靜態方法 import java.net.*; class IPDemo { public s

JavaStringStringBuilderStringBuffer常用源碼分析比較(一):String源碼分析

array string類 都是 epo sys 匹配字符串 bound 地址 簡單 String: 一、成員變量: /** The value is used for character storage. */ private final char value[

JavaStringStringBuilderStringBuffer常用源碼分析比較(二):StringBuilderStringBuffer源碼分析

string類型 character private 字符 代碼 less pri des over StringBuilder: 一、構造方法: /** * Constructs a string builder with no characters in i

JavaStringStringBuilderStringBuffer常用源碼分析比較(三):StringStringBuilderStringBuffer比較

val str 成員變量 相同 += let .get end art 看這篇隨筆之前請務必先看前面兩章: Java中String、StringBuilder、StringBuffer常用源碼分析及比較(一):String源碼分析 Java中String、StringBui

Java靜態成員類靜態內部類的Builder模式構建物件靜態內部類構建單例模式

一、什麼是巢狀類 巢狀類是指被定義在另一個類的內部的類。巢狀類存在的目的應該只是為他的外圍類提供服務。如果巢狀類將來可能會用於其他的某個環境中,它就應該是頂層類。巢狀類有四種:靜態成員類、非靜態成員類、匿名類和區域性類。除了第一種之外,其他三種被稱為內部類。

JAVAfloatdoubleBigDecimal的區別資料型別注意事項

單精度浮點數(float)與雙精度浮點數(double)的區別如下: (1)在記憶體中佔有的位元組數不同     單精度浮點數在機內佔4個位元組     雙精度浮點數在機內佔8個位元組 (2)有效數字位數不同     單精度浮點數有效數字8位     雙精度浮點數有效數字1

javaMapJSONArrayJSONObject的關係轉換以及json字串與json物件的轉化

    本文通過實際程式碼來探討一下java中的Map、JSONArray、JSONObject的關係及其轉換。直接上程式碼: import java.util.HashMap; import java.util.Map; import net.sf.json.JSONA

關於網路程式設計MTUTCPUDP優化配置的一些總結

轉載來自:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html 首先要看TCP/IP協議,涉及到四層:鏈路層,網路層,傳輸層,應用層。    其中乙太網(Ethernet)的資料幀在鏈路層

聊聊UDPTCP和實現一個簡單的JAVA UDP小Demo

  最近真的比較忙,很久就想寫了,可是一直苦於寫點什麼,今天腦袋靈光一閃,覺得自己再UDP方面還有些不瞭解的地方,所以要給自己掃盲。   好了,咱們進入今天的主題,先列一下提綱:   1. UDP是什麼,UDP適用於什麼場景?   2. 寫一個小Demo來加深一下UDP的理解。   3. UDP和TCP的區別

java ++前後差別試題靜態變量一旦賦值不可改變

strong string 變量 void system 自身 mod span n) package javaTest; public class Increment { private static int k=0; public static void m

Java之HashtableHashMapProperties

們的 行為 重新 用途 values lan 很大的 輕量 實現 HashTable繼承於比較古老的Dictionary,而HashMap是接口Map的實現。 HashMap是HashTable的一個輕量級實現,HashMap不是線程安全的,而HashTable是線程

JavaPODOTODTO VO BOPOJO DAO的概念

操作方法 工作經歷 世界 get 包含 程序 base 進行 需要 1.PO(persistant object) 持久對象??在 o/r 映射的時候出現的概念,如果沒有 o/r 映射,沒有這個概念存在了。通常對應數據模型 ( 數據庫 ), 本身還有部分業務邏輯的處理。可以

javaExecutorExecutorServiceThreadPoolExecutor介紹

cut .net mil col 20px 介紹 bsp tex exe java中Executor、ExecutorService、ThreadPoolExecutor介紹 ExecutorService 的理解與使用 java中Executor、ExecutorSer

深入理解C++publicprotectedprivate用法

strong ostream pro index nbsp contain table bsp 新的 深入理解C++中public、protected及private用法 投稿:shichen2014 字體:[增加 減小] 類型:轉載 時間:2014-08-23 我要評論

全面解釋javaStringBuilderStringBufferString類之間的關系

() 大於等於 修飾 軟件 進行 lan lin 字符 str StringBuilder、StringBuffer、String類之間的關系   java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,在上一篇博文中我們已

【轉】QTQWidgetQDialogQMainWindow的區別

屏幕 編輯 派生 標記 裝飾 按鈕 set 沒有 idg QWidget類是所有用戶界面對象的基類。 窗口部件是用戶界面的一個基本單元:它從窗口系統接收鼠標、鍵盤和其它事件,並且在屏幕上繪制自己。每一個窗口部件都是矩形的,並且它們按Z軸順序排列。一個窗口部件可以被它的父窗口

轉:javastaticfinalstatic final的區別

重寫 一個 修改 表示 指針 子類 不同 常數 ati http://blog.csdn.net/qq1623267754/article/details/36190715 final可以修飾:屬性,方法,類,局部變量(方法中的變量) final修飾的屬性的初始化

Java VO PODODTO BO QODAOPOJO的概念

ati 提高 處理 應用 簡單的 setter getter 行業 相關 PO(persistent object) 持久對象 在 o/r 映射的時候出現的概念,如果沒有 o/r 映射,沒有這個概念存在了。通常對應數據模型 ( 數據庫 ), 本身還有部分業務邏輯的處理。可

java byte[]FileInputStream 互相轉換

output 轉換 ava available byte數組 leo ear inpu red 1、將File、FileInputStream 轉換為byte數組: File file = new File("test.txt"); InputStream input =

JavaBigDecimal類介紹用法

exceptio decimal body ue4 mage oat 比較運算符 mod 乘法   Java中提供了大數字(超過16位有效位)的操作類,即 java.math.BinInteger 類和 java.math.BigDecimal 類,用於高精度計算.   其