Java網(wǎng)絡(luò)編程
InetAddress對(duì)象的常見(jiàn)使用方法
//獲取本機(jī)的InetAddress對(duì)象
InetAddress localhost = InetAddress.getLocalHost();
System.out.println(localhost);
//根據(jù)指定的主機(jī)名獲取InetAddres對(duì)象
InetAddress host = InetAddress.getByName("LAPTOP-9C26JBRD");
System.out.println(host);
//根據(jù)域名返回InetAddres對(duì)象,比如www.baidu.com
InetAddress hostBaidu = InetAddress.getByName("www.baidu.com");
System.out.println(hostBaidu);
//通過(guò) InetAddress對(duì)象獲取對(duì)應(yīng)地址
String hostAddress = hostBaidu.getHostAddress();
System.out.println(hostAddress);
//通過(guò) InetAddress對(duì)象獲取對(duì)應(yīng)域名或者主機(jī)名
String hostName = hostBaidu.getHostName();
System.out.println(hostName);
//結(jié)果
LAPTOP-9C26JBRD/192.168.23.1
LAPTOP-9C26JBRD/192.168.23.1
www.baidu.com/14.215.177.38
14.215.177.38
www.baidu.com
Socket
客戶端:
當(dāng)我們需要通訊時(shí)(讀寫(xiě)數(shù)據(jù))
1.socket.getOutputStream()
2.socket.getInputStream()
服務(wù)端:
當(dāng)我們需要通訊時(shí)(讀寫(xiě)數(shù)據(jù))
1.socket.getOutputStream()
2.socket.getInputStream()
客戶端和服務(wù)器端通常情況下,是在不同主機(jī)的
TCP應(yīng)用案例1
1.編寫(xiě)一個(gè)服務(wù)器端和客戶端
2.服務(wù)器端在9999端口監(jiān)聽(tīng)
3.客戶端連接到服務(wù)器端,發(fā)送“hello,server”,然后退出
4.服務(wù)器端接收到客戶端發(fā)送的信息,輸出,并退出
服務(wù)器端
package com.zz.socket.server;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Projectname: socket
* @Filename: SocketTcpServer
* @Author: wyf
* @Data: 2022/12/1 10:51
* @Description: TODO
*/
public class SocketTcpServer {
public static void main(String[] args) throws IOException {
//1.在9999端口監(jiān)聽(tīng),等待連接
//要求沒(méi)有其他服務(wù)監(jiān)聽(tīng)9999
//serverSocket可以返回多個(gè)socket
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服務(wù)端,在9999端口監(jiān)聽(tīng),等待連接");
//2.當(dāng)客戶端沒(méi)有連接9999端口時(shí),程序會(huì)阻塞,等待連接
//如果有客戶端連接,則會(huì)返回socket對(duì)象
Socket socket = serverSocket.accept();
System.out.println("服務(wù)器端:socket="+socket.getClass());
//3.通過(guò)socket.getInputStream()讀取客戶端寫(xiě)入到數(shù)據(jù)通道的數(shù)據(jù)顯示
InputStream inputStream = socket.getInputStream();
//4.Io讀取
byte[] bytes = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes, 0, readLen));
}
//5.關(guān)閉相關(guān)流
inputStream.close();
socket.close();
serverSocket.close();
}
}
客戶端
package com.zz.socket.client;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Projectname: socket
* @Filename: SocketTcpClient
* @Author: wyf
* @Data: 2022/12/1 10:58
* @Description: TODO
*/
public class SocketTcpClient {
public static void main(String[] args) throws IOException {
//1.連接服務(wù)端
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客戶端:socket="+socket.getClass());
//2.連接上后生成socket,通過(guò)socket.getOutputStream()
OutputStream outputStream = socket.getOutputStream();
//3.通過(guò)輸出流,寫(xiě)入數(shù)據(jù)到數(shù)據(jù)通道
outputStream.write("hello server".getBytes());
//4.關(guān)閉流對(duì)象和socket
outputStream.close();
socket.close();
}
}
TCP應(yīng)用案例2
1.編寫(xiě)一個(gè)服務(wù)器端和客戶端
2.服務(wù)器端在9999端口監(jiān)聽(tīng)
3.客戶端連接到服務(wù)器端,發(fā)送“hello,server”
4.服務(wù)器端接收到客戶端發(fā)送的信息,輸出,然后發(fā)送“hello client”并退出
5.客戶端接收服務(wù)器端發(fā)送的數(shù)據(jù),輸出,并退出
服務(wù)器端
package com.zz.socket.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Projectname: socket
* @Filename: SocketTcpServer02
* @Author: wyf
* @Data: 2022/12/1 11:21
* @Description: TODO
*/
public class SocketTcpServer02 {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("正在監(jiān)聽(tīng)9999端口");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes, 0, readLen));
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello client!".getBytes());
//寫(xiě)入結(jié)束標(biāo)記
socket.shutdownOutput();
serverSocket.close();
socket.close();
inputStream.close();
outputStream.close();
}
}
客戶端
package com.zz.socket.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Projectname: socket
* @Filename: SocketTcpClient02
* @Author: wyf
* @Data: 2022/12/1 11:21
* @Description: TODO
*/
public class SocketTcpClient02 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客戶端開(kāi)始連接!");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello server".getBytes());
//寫(xiě)入結(jié)束標(biāo)記
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,readLen));
}
}
}
使用字符流實(shí)現(xiàn)應(yīng)用案例2
服務(wù)器端
package com.zz.socket.server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Projectname: socket
* @Filename: SocketTcpServer
* @Author: wyf
* @Data: 2022/12/1 10:51
* @Description: TODO
*/
public class SocketTcpServer03 {
public static void main(String[] args) throws IOException {
//1.在9999端口監(jiān)聽(tīng),等待連接
//要求沒(méi)有其他服務(wù)監(jiān)聽(tīng)9999
//serverSocket可以返回多個(gè)socket
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服務(wù)端,在9999端口監(jiān)聽(tīng),等待連接");
//2.當(dāng)客戶端沒(méi)有連接9999端口時(shí),程序會(huì)阻塞,等待連接
//如果有客戶端連接,則會(huì)返回socket對(duì)象
Socket socket = serverSocket.accept();
System.out.println("服務(wù)器端:socket="+socket.getClass());
//3.通過(guò)socket.getInputStream()讀取客戶端寫(xiě)入到數(shù)據(jù)通道的數(shù)據(jù)顯示
InputStream inputStream = socket.getInputStream();
//4.Io讀取
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello client");
bufferedWriter.newLine();
bufferedWriter.flush();
//5.關(guān)閉相關(guān)流
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
}
}
客戶端
package com.zz.socket.client;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* @Projectname: socket
* @Filename: SocketTcpClient
* @Author: wyf
* @Data: 2022/12/1 10:58
* @Description: TODO
*/
public class SocketTcpClient03 {
public static void main(String[] args) throws IOException {
//1.連接服務(wù)端
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客戶端:socket="+socket.getClass());
//2.連接上后生成socket,通過(guò)socket.getOutputStream()
OutputStream outputStream = socket.getOutputStream();
//3.通過(guò)輸出流,寫(xiě)入數(shù)據(jù)到數(shù)據(jù)通道
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello server!");
//寫(xiě)入結(jié)束標(biāo)記
bufferedWriter.newLine();
bufferedWriter.flush();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
//4.關(guān)閉流對(duì)象和socket
bufferedReader.close();
bufferedWriter.close();
socket.close();
}
}
讀取文件
服務(wù)端
package com.zz.socket.upload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Projectname: socket
* @Filename: UploadServer
* @Author: wyf
* @Data: 2022/12/1 14:02
* @Description: TODO
*/
public class UploadServer {
public static void main(String[] args) throws IOException {
//開(kāi)啟服務(wù)監(jiān)聽(tīng)
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("開(kāi)始監(jiān)聽(tīng)9999端口號(hào)");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
byte[] bytes = new byte[1024];
ByteArrayOutputStream bao = new ByteArrayOutputStream();
int readLen = 0;
while ((readLen = bis.read(bytes)) != -1){
bao.write(bytes, 0, readLen);
}
byte[] bytes1 = bao.toByteArray();
String path = "src\\idea.png";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
bos.write(bytes1);
bos.close();
bis.close();
serverSocket.close();
socket.close();
}
}
客戶端
package com.zz.socket.upload;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Projectname: socket
* @Filename: UploadClient
* @Author: wyf
* @Data: 2022/12/1 14:02
* @Description: TODO
*/
public class UploadClient {
public static void main(String[] args) throws IOException {
//連接服務(wù)器端
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("連接了服務(wù)器端!");
String path = "e:\\image\\idea.png";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
byte[] bytes = new byte[1024];
ByteArrayOutputStream bao = new ByteArrayOutputStream();
int readLen = 0;
while ((readLen = bis.read(bytes)) != -1){
bao.write(bytes, 0, readLen);
}
byte[] bytes1 = bao.toByteArray();
OutputStream outputStream = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
bos.write(bytes1);
bos.flush();
bis.close();
socket.shutdownOutput();
bos.close();
socket.close();
}
}