java網絡通信——socket

最近閒來沒事,在慕課網上看了socket網絡編程,在此做些筆記,希望對感興趣的同志有所幫助。


在java中對於網絡的支持,它是根據不同的網絡層次,java有不同的類的支持。

1.InetAddress:用於標識網絡上硬件資源的(網絡的ip)

2.URL:通過URL可以直接讀取網絡上的資源和直接把資源寫入到網絡上,組成(協議名稱和資源名稱,之間用冒號隔開)

3.Sockets:用TCP協議實現網絡通信的socket相關的類

4.Datagram:udp協議,通過數據包進行網絡同信


對於他們是否都具有構造方法呢?

InetAddress:沒有構造方法,但是有靜態方法

URL:有構造方法,可以通過openStream()方法獲取指定資源的輸入流

socket:有構造方法

ServerSocket:有構造方法

注意:我們知道在網絡上有 client(客服端)和server(服務端)的說法,

對於client而言它的socket的類是socket,對於server的socket的類是ServerSocket,


socker和ServerSocket都是基於TCP協議實現的網絡通信


以下是相應的列子:

1.InetAddress的列子:

public class Test01 {
public static void main(String[] args){
try {
InetAddress address=InetAddress.getLocalHost();
System.out.println("address"+address);
System.out.println("name:"+address.getHostName());
System.out.println("ip:"+address.getHostAddress());
byte[] bytes=address.getAddress();
System.out.println("byte ip:"+Arrays.toString(bytes));

//根據計算機名字來獲取實例
InetAddress address2=InetAddress.getByName("ldypc");
System.out.println("name2:"+address2.getHostName());
System.out.println("ip2:"+address2.getHostAddress());

//根據ip地址來獲取實例
InetAddress address3=InetAddress.getByName("10.13.7.13");
System.out.println("name3:"+address3.getHostName());
System.out.println("ip3:"+address3.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}


2.URL的列子:

package imooc;

import java.net.MalformedURLException;
import java.net.URL;

public class test02 {
public static void main(String[] args){
String url="http://www.imooc.com";
try {
URL imooc=new URL(url);
//?後面表示參數,#後面表示錨點
URL newUrl=new URL(imooc,"/index.html?username=tom#test");
System.out.println("協議:"+newUrl.getProtocol());
System.out.println("host:"+newUrl.getHost());
//如果沒有指定端口,就是用默認的端口號,返回的就是-1
System.out.println("port:"+newUrl.getPort());
System.out.println("file path:"+newUrl.getPath());
System.out.println("file name:"+newUrl.getFile());
System.out.println("xiang dui path:"+newUrl.getRef());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}


3.URL獲取資源:

package imooc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class Test03 {
public static void main(String[] args){
try {
URL imooc=new URL("http://www.baidu.com");
//通過url的Openstream方法獲取指定對象的資源的字節輸入流
InputStream is=imooc.openStream();
//把字節輸入流轉換爲字符輸入流
InputStreamReader isr=new InputStreamReader(is,"utf-8");
//把字符流添加到緩衝中
BufferedReader br=new BufferedReader(isr);
//一次讀取一行
String data=br.readLine();
while(data!=null){
System.out.println(data);
data=br.readLine();
}
br.close();
isr.close();
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


4.一個TCP協議的列子,兩個程序:一個是client(客服端),一個server(服務端):

client 的列子——Socket的用法:

package imooc;

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.Socket;
import java.net.UnknownHostException;

public class Client {
public static void main(String[] args){
try {
//創建客戶端socket,指定服務器地址和端口
Socket socket=new Socket("localhost",8888);
//獲取輸出流用來想服務器端發送信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("username:admin;password:123");
pw.flush();
socket.shutdownOutput();
//輸入流
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客服端,服務器說:"+info);
}
socket.shutdownInput();
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

server端的列子——ServerSocket的用法:

package imooc;

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.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args){
try {
//創建一個服務器端socket(ServerSocket),指定綁定的端口並監聽
ServerSocket serverSocket=new ServerSocket(8888);
//調用accept()方法開始監聽,等待客戶端連接
System.out.println("等待客戶端連接");
int count=0;
while(true){                                                                                           //while()程序段是多線程接收客服端的請求
Socket socket=serverSocket.accept();
//創建一個新的線程
ServerThread serverThread=new ServerThread(socket);
//啓動
serverThread.start();
count++;
System.out.println("count="+count);
InetAddress inetAddress=socket.getInetAddress();
System.out.println("ip:"+inetAddress.getHostAddress());
}

//獲取輸入流用來讀取客戶端的信息
/*                                                                        //這裏註釋的是單線程接收客服端的請求
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是服務器,客戶端說:"+info);
}
socket.shutdownInput();
//獲取輸出流,響應客戶端的請求
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("welcome");
pw.flush();

//關閉資源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
*/
//serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


5.UDP協議的client和server:

client端的代碼:

package imooc;


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

public class UDPClient {
public static void main(String[] args){
//定義服務器的地址,端口號,數據
try {
InetAddress address=InetAddress.getByName("localhost");
int port=8888;
byte[] data="usernaem:admin;password:123".getBytes();
//創建數據包
DatagramPacket packet=new DatagramPacket(data,data.length, address,port);
//創建
DatagramSocket socket=new DatagramSocket();
//發送
socket.send(packet);

//datagrampacket
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//接收
socket.receive(packet2);
//讀取數據
String reply=new String (data2,0,packet2.getLength());
System.out.println("我是客戶端,服務端說:"+reply);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

server段的代碼:

package imooc;

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

public class UDPServer {
public static void main(String[] args){
try {
//創建DatagramSocket,指定端口號
DatagramSocket socket=new DatagramSocket(8888);
//創建DatagramPacket
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,data.length);
//接收客戶端的信息
//此方法在接受數據前,處於阻塞
socket.receive(packet);
//讀取數據
String info=new String (data,0,packet.getLength());
System.out.println("我是服務器,客戶端說:"+info);
//定義client的地址,端口號,信息
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="welcome".getBytes();
//Datagrampacket
DatagramPacket packet2=new DatagramPacket(data2, data.length,address,port);
socket.send(packet2);
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}



希望對你有所幫助,謝謝花時間閱讀,寫的不是很好,望能接受。

發佈了26 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章