一.Socket的基礎知識
1.socket的位置作用與典型的TCP/IP模型結構
2.socket的分類(原始式套接字、流式套接字、數據報式套接字)
二、TCP編程示例
package com.socket;
import java.io.Serializable;
/**
* 序列化對象實體類
* @author xue
*
*/
public class Person implements Serializable {
private String account;
private String pwd;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
package com.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
/**
* 多線程實現服務器與多客戶端之間的通信
*/
public class ThreadSocket extends Thread {
protected Socket socket=null;
public ThreadSocket(Socket socket){
this.socket=socket;
}
public void run() {
try {
/*
* 讀取信息
*/
InputStream is=socket.getInputStream();//獲取輸入流
ObjectInputStream obj=new ObjectInputStream(is);//對象流輸入
try {
Person p=(Person) obj.readObject();
//用戶信息
System.out.println("用戶賬號:"+p.getAccount()+"----------"+"用戶密碼:"+p.getPwd());
InetAddress address=socket.getInetAddress();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket.shutdownInput();//關閉輸入流
/*
* 給客戶端返回信息
*/
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("歡迎用戶的到來.....");
pw.flush();
socket.shutdownOutput();
is.close();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
* socket服務器
*/
public class Server {
public static void main(String[] args) {
getConn();
}
public static void getConn(){
try {
ServerSocket serverSocket=new ServerSocket(10086);//創建一個socket
Socket socket=null;
/*
* 起用多線程監聽
*/
int i=0;//用於統計有幾個用戶訪問該服務器
while(true){
//循環調用accept()等待客戶端連接
socket=serverSocket.accept();
ThreadSocket threadSocket=new ThreadSocket(socket);
threadSocket.start();
i++;
System.out.println("一共有:"+i+"個人訪問該服務器");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
* socket客戶端
*/
public class Client {
public static void main(String[] args) {
getConn();
}
public static void getConn(){
try {
Socket socket=new Socket("127.0.0.1",10086);
/*
* 發信息至服務器
*/
OutputStream os=socket.getOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(os);
Person p=new Person();
p.setAccount("123445");
p.setPwd("abcd");
oos.writeObject(p);
/*
* 返回信息給服務端
*/
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String replyInfo=null;
while((replyInfo=br.readLine())!=null){
System.out.println("客戶端讀取服務端發來的消息:"+replyInfo);
}
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通信流程:
三、UDP編程
1.UDP概述:
2.示例
package com.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* UDP網絡編程
*/
public class UDPServer {
public static void main(String[] args) {
getUDPClientConn();
}
/*
* 與客戶端進行通信
*/
public static void getUDPClientConn(){
try {
//====================獲取客戶端發來的信息 =====================//
//創建服務器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(10086);
byte [] datagram=new byte[1024];
//創建數據報,用於接受客戶端發送的數據
DatagramPacket packetFromClient=new DatagramPacket(datagram, datagram.length);
//接收客戶端發送的數據,此方法之前會發生阻塞
socket.receive(packetFromClient);
//獲取數據
String info=new String(datagram, 0, datagram.length);
System.out.println("客戶端發來了信息:"+info);
//===================向客戶端響應發送信息====================//
InetAddress address=packetFromClient.getAddress();//客戶端地址
int port=packetFromClient.getPort();
byte[] sendInfo="服務端返回信息:歡迎你".getBytes();//返回信息
DatagramPacket packetToClient=new DatagramPacket(sendInfo, 0, sendInfo.length, address, port);
socket.send(packetToClient);
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* UDP網絡編程客戶端
*/
public class UDPClient {
public static void main(String[] args) {
getUDPServerConn();
}
public static void getUDPServerConn(){
//================客戶端發送信息至服務器====================//
try {
InetAddress address=InetAddress.getByName("127.0.0.1");//服務器地址
int port=10086;
byte[] dataToServer="客戶端請求連接服務端".getBytes();
DatagramPacket sendToServerPacket=new DatagramPacket(dataToServer, dataToServer.length, address, port);
DatagramSocket socket=new DatagramSocket();
socket.send(sendToServerPacket);
//=================獲取服務端發過來的信息==================//
byte[]dataFromServer=new byte[1024];
DatagramPacket dataFromServerPacket=new DatagramPacket(dataFromServer, 0, dataFromServer.length);
socket.receive(dataFromServerPacket);
String info=new String(dataFromServer,0,dataFromServer.length);
System.out.println("服務端發來的信息:"+info);
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四、其他內容
1. InetAddress類用於標識網絡上的硬件資源,標識互聯網協議(IP)地址。
2. URL(Uniform Resource Locator)統一資源定位符,表示Internet上某一資源的地址,協議名:資源名稱
3. 示例:
package com.socket;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
/**
* 1.InetAddress類用於標識網絡上的硬件資源,標識互聯網協議(IP)地址。
* 2.通過URL對象的openStream()方法可以得到指定資源的輸入流,通過流能夠讀取或訪問網頁上的資源
*/
public class SocketServer {
public static void main(String[] args) {
getLocalHost();
getWebDateByUrl();
}
public static void getLocalHost(){
try {
//本地主機信息
InetAddress address=InetAddress.getLocalHost();
System.out.println("本地IP地址:"+address.getHostAddress());//Ip地址
System.out.println("本地主機名:"+address.getHostName());//計算機名
//其他主機信息
InetAddress otherAddress=InetAddress.getByName("172.18.233.1");
System.out.println(otherAddress.getHostName());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 通過URL讀取網頁內容
*/
public static void getWebDateByUrl(){
try {
URL url=new URL("http://www.baidu.com");
InputStream is=url.openStream();//通過openStream獲取輸入流
InputStreamReader isr=new InputStreamReader(is, "UTF-8");//輸入流轉爲字符流
BufferedReader br=new BufferedReader(isr);//加入緩衝區
String data=br.readLine();
String html="";
FileOutputStream fos=new FileOutputStream(new File("D://baidu.html"));//寫到網頁文件
while(data!=null){
System.out.println(data);
html+=data;
data=br.readLine();
}
fos.write(html.getBytes("UTF-8"));
is.close();
isr.close();
br.close();
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}