Java基礎教程——Socket編程


Socket通常也稱作“套接字”,用於描述IP地址和端口,可以用來實現不同虛擬機或不同計算機之間的通信。
——百度百科

套接字允許應用程序插入到網絡中,並與插入到網絡中的其他應用程序通信。
——《TCP/IP Socket編程·TCP/IP in C》

Socket編程示意圖:

Socket.png

服務器需要先啟動,等待客戶端連接。
客戶端主動連接服務器,連接成功才能通信。

字節流版本

服務端:

import java.net.*;
import java.io.*;
public class Skt字節流S {
	public static void main(String[] args) {
		try {
			ServerSocket sSocket = new ServerSocket(8888);
			System.out.println("new ServerSocket");
			Socket s = sSocket.accept();
			System.out.println("accept()");
			InputStream is = s.getInputStream();
			OutputStream os = s.getOutputStream();
			byte[] b = new byte[1024];
			int len = is.read(b);
			String str = new String(b, 0, len);
			System.out.println("客戶端說:" + str);
			os.write("對不起,我們這三碗不過崗".getBytes());
			is.close();
			os.close();
			s.close();
			sSocket.close();
			System.out.println("服務器端,OVER");
		} catch (Exception e) {
		}
	}
}

客戶端:

import java.net.*;
import java.io.*;
public class Skt字節流C {
	public static void main(String[] args) {
		try {
			// Socket s = new Socket(InetAddress.getLocalHost() , 8888);
			Socket s = new Socket("127.0.0.1", 8888);
			InputStream is = s.getInputStream();
			OutputStream os = s.getOutputStream();
			os.write("你好,我要10碗酒,三斤牛肉".getBytes());
			byte[] b = new byte[1024];
			int len = -1;
			while ((len = is.read(b)) > 0) {
				String str = new String(b, 0, len);
				System.out.println("服務器端的回復:" + str);
			}
			is.close();
			os.close();
			s.close();
			System.out.println("客戶端Over");
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

看效果時,可以一個程序用Eclipse啟動,一個用cmd啟動,編譯時如果有錯,可用如下語句:

javac -encoding utf-8  XXX.java

cmd運行程序時,不要有包名。


字符流版本

服務端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SktCharacterS {
	public static void main(String[] args) {
		try {
			ServerSocket sSocket = new ServerSocket(8888);
			Socket s = sSocket.accept();
			InputStream is = s.getInputStream();
			OutputStream os = s.getOutputStream();
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader bufR = new BufferedReader(isr);
			PrintWriter prtW = new PrintWriter(os);
			// -----------------------------------------------------
			String str = bufR.readLine();
			System.out.println("——" + str);
			prtW.print("你好,我是服務器");
			prtW.flush();
			bufR.close();
			isr.close();
			is.close();
			prtW.close();
			os.close();
			s.close();
			sSocket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

客戶端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SktCharacterC {
	public static void main(String[] args) {
		Socket s;
		try {
			s = new Socket(InetAddress.getLocalHost(), 8888);
			InputStream is = s.getInputStream();
			OutputStream os = s.getOutputStream();
			PrintWriter prtW = new PrintWriter(os);
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader bufR = new BufferedReader(isr);
			// --------------------------------------------------
			prtW.println("你好我是客戶機");
			prtW.flush();
			String str = bufR.readLine();
			System.out.println("——" + str);
			bufR.close();
			isr.close();
			is.close();
			prtW.close();
			os.close();
			s.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

socket發送文件(基本款)

服務端:

import java.net.*;
import java.io.*;
public class SktFileS {
	public static void main(String[] args) {
		try {
			ServerSocket sSocket = new ServerSocket(8888);
			Socket s = sSocket.accept();
			InputStream ips = s.getInputStream();
			FileOutputStream fos = new FileOutputStream("recv.png");
			byte[] b = new byte[1024];
			int nLen = -1;
			while (true) {
				nLen = ips.read(b);
				if (nLen == -1) {
					break;
				}
				fos.write(b, 0, nLen);
			}
			fos.close();
			ips.close();
			s.close();
			sSocket.close();
		} catch (Exception e) {
		} finally {
			System.out.println("服務器端,OVER");
		}
	}
}

客戶端:

import java.net.*;
import java.io.*;
public class SktFileC {
	public static void main(String[] args) {
		try {
			Socket s = new Socket("127.0.0.1", 8888);
			OutputStream ops = s.getOutputStream();
			FileInputStream fis = new FileInputStream("send.png");
			byte[] b = new byte[1024];
			int nLength = -1;
			while ((nLength = fis.read(b)) > 0) {
				ops.write(b, 0, nLength);
			}
			fis.close();
			ops.close();
			s.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			System.out.println("客戶端Over");
		}
	}
}

socket發送文件(帶文件名)

服務端:

import java.net.*;
import java.io.*;
public class SktFileWithNameS {
	public static void main(String[] args) {
		try {
			ServerSocket sSocket = new ServerSocket(8888);
			Socket s = sSocket.accept();
			InputStream ips = s.getInputStream();
			InputStreamReader isr = new InputStreamReader(ips);
			BufferedReader br = new BufferedReader(isr);
			// 讀取文件名
			FileOutputStream fos = new FileOutputStream("recv_" + br.readLine());
			// 讀取文件
			byte[] b = new byte[1024];
			int nLen = -1;
			while (true) {
				nLen = ips.read(b);
				if (nLen == -1) {
					break;
				}
				fos.write(b, 0, nLen);
			}
			fos.close();
			ips.close();
			s.close();
			sSocket.close();
		} catch (Exception e) {
		} finally {
			System.out.println("服務器端,OVER");
		}
	}
}

客戶端:

import java.net.*;
import java.io.*;
public class SktFileWithNameC {
	public static void main(String[] args) {
		try {
			Socket s = new Socket("127.0.0.1", 8888);
			// 輸出流
			OutputStream ops = s.getOutputStream();
			PrintWriter pw = new PrintWriter(ops, true);
			// 文件讀入
			String strFile = "send.png";
			File f = new File(strFile);
			FileInputStream fis = new FileInputStream(f);
			// 寫文件名
			pw.println(f.getName());
			// 文件內容發送
			byte[] b = new byte[1024];
			int nLength = -1;
			while ((nLength = fis.read(b)) > 0) {
				ops.write(b, 0, nLength);
			}
			pw.close();
			fis.close();
			ops.close();
			s.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			System.out.println("客戶端Over");
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM