一、InerAddress 獲取計(jì)算機(jī)信息
try {
//獲取本機(jī)InerAddress實(shí)例
InetAddress address =InetAddress.getLocalHost();
address.getHostName(); //獲取計(jì)算機(jī)名
address.getHostAddress(); //獲取計(jì)算機(jī)IP地址
address.getAddress(); //獲取數(shù)組形式的IP地址
//其他方式獲取InerAddress實(shí)例
InetAddress address2 = InetAddress.getByName("主機(jī)名");
InetAddress address3 = InetAddress.getByName("Ip地址");
} catch (UnknownHostException e) {
e.printStackTrace();
}
二、URL 網(wǎng)絡(luò)資源的地址
try {
//創(chuàng)建URL實(shí)例
URL url = new URL("http://www.baidu.com");
//根據(jù)已存在的URL創(chuàng)建新的URL
URL newUrl = new URL(url,"/index.html?username=tom");
url.getProtocol(); //獲取協(xié)議信息
url.getHost(); //獲取主機(jī)信息
url.getPort(); //獲取端口號(hào)
url.getPath(); //獲取文件路徑
url.getFile(); //獲取文件名
url.getRef(); //獲取相對(duì)路徑
url.getQuery(); //獲取查詢字符串
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
InputStream is =url.openStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String data = br.readLine();
while(data!=null){
System.out.println(data);
data = br.readLine();
}
//釋放資源
is.close();
isr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
三、ServerSocket 服務(wù)器端
try {
//1、創(chuàng)建服務(wù)器端Socket
ServerSocket server = new ServerSocket(8888);
//2、開始監(jiān)聽,等待客戶端的連接
Socket socket = server.accept();
//3、獲取輸入流,讀取客戶端信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bf = new BufferedReader(isr);
String info = null;
while((info=bf.readLine())!=null){
System.out.println("客戶端請(qǐng)求:"+info);
}
//4、獲取輸出流,響應(yīng)客戶端請(qǐng)求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("服務(wù)器響應(yīng)客戶端");
pw.flush();
//5、釋放資源
server.close();
socket.shutdownInput();
is.close();
isr.close();
bf.close();
os.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
四、Socket 客戶端
try {
//1、創(chuàng)建客戶端Socket,指定服務(wù)器地址和窗口
Socket socket = new Socket("localhost",8888);
//2、獲取輸出流,向服務(wù)器端發(fā)送信息
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("客戶端發(fā)送信息到服務(wù)器端");
pw.flush();
socket.shutdownOutput();
//3、獲取輸入流,讀取服務(wù)器端的響應(yīng)信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = br.readLine();
while(info!=null){
System.out.println("服務(wù)器端相應(yīng):"+info);
}
//4、釋放資源
socket.close();
os.close();
pw.close();
is.close();
isr.close();
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
五、多線程實(shí)現(xiàn)多客戶端的通信
//服務(wù)器端的多線程類
public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader bf = null;
OutputStream os = null;
PrintWriter pw = null;
try {
// 響應(yīng)客戶端的請(qǐng)求
is = socket.getInputStream();
isr = new InputStreamReader(is);
bf = new BufferedReader(isr);
String info = null;
while ((info = bf.readLine()) != null) {
System.out.println(info);
}
// 獲取輸出流,相應(yīng)客戶端請(qǐng)求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("服務(wù)器響應(yīng)客戶端");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally { // 釋放資源
try {
if (is != null)
is.close();
if (isr != null)
isr.close();
if (bf != null)
bf.close();
if (os != null)
os.close();
if (pw != null)
pw.close();
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//修改服務(wù)器端的接收socket
Socket socket = null;
while(true){
socket = server.accept();
ServerThread thread = new ServerThread(socket);
thread.start();
六、實(shí)現(xiàn)基于UDP的Socket通信
//服務(wù)器端
try {
//1、創(chuàng)建服務(wù)器端,指定端口
DatagramSocket socket = new DatagramSocket(8800);
//2、創(chuàng)建數(shù)據(jù)報(bào),用于接收客戶端發(fā)送的數(shù)據(jù)
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
//3、接收客戶端發(fā)送的數(shù)據(jù)
socket.receive(packet);
//4、讀取數(shù)據(jù)
String info =new String(data,0,packet.getLength());
System.out.println("客戶端信息:"+info);
//1、創(chuàng)建數(shù)據(jù)報(bào),用于接收服務(wù)器端響應(yīng)的數(shù)據(jù)
byte[] data1 = new byte[1024];
DatagramPacket packet1 = new DatagramPacket(data1, data1.length);
//2、接收服務(wù)器響應(yīng)的數(shù)據(jù)
socket.receive(packet1);
//讀取服務(wù)器端響應(yīng)的數(shù)據(jù)
String reply = new String(data1,0,packet1.getLength());
System.out.println("服務(wù)器響應(yīng)信息:"+reply);
//4、釋放資源
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//客戶端
try {
//1、定義服務(wù)器端的地址、端口號(hào)、數(shù)據(jù)
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data ="客戶端發(fā)送到服務(wù)器端的信息".getBytes();
//2、創(chuàng)建數(shù)據(jù)報(bào),包括發(fā)送的數(shù)據(jù)信息
DatagramPacket packet = new DatagramPacket(data, data.length,address,port);
//3、創(chuàng)建發(fā)送數(shù)據(jù)的對(duì)象
DatagramSocket socket = new DatagramSocket();
//4、向服務(wù)器端發(fā)送數(shù)據(jù)
socket.send(packet);
//1、定義客戶端的地址、端口號(hào)、數(shù)據(jù)
InetAddress address1 = packet.getAddress();
int port1 = packet.getPort();
byte[] data1 = "服務(wù)器端響應(yīng)客戶端的信息".getBytes();
//2、創(chuàng)建數(shù)據(jù)報(bào),包含響應(yīng)的數(shù)據(jù)信息
DatagramPacket packet1 = new DatagramPacket(data1, data1.length,address1,port1);
//3、響應(yīng)客戶端
socket.send(packet1);
//4、釋放資源
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
七、Socket常見問題
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。