Java 网络编程
Port
端口号:在通信实体上进行网络通讯的唯一标识。
端口分类:
- 公认端口:0 ~ 1023
- 注册端口:1024 ~ 49151
- 动态或私有端口:49152 ~ 65535
常用端口
- MySql:3306
- Oracle:1521
- Tomcat:8080
- SMTP:25
- Web服务器:80
- FTP服务器:21
InetAddress类
表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。
方法
| 方法名 | 作用 |
|---|---|
| public static InetAddress getLocalHost() | 获取本地主机地址对象 |
| public static InetAddress getByName(String host) | 根据主机名称获取地址对象 |
| public static InetAddress[] getAllByName(String host) | 获取所有相关地址对象 |
| public String getHostAddress() | 获取IP地址字符串 |
| public String getHostName() | 获取IP地址主机名 |
基于TCP的网络编程
- Socket编程
- Socket(套接字)是网络中的一个通信节点
- 分为客户端Socket与服务器ServerSocket
- 通信要求:IP地址 + 端口号
TCP编程实现客户端发送数据给服务器端
客户端
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("10.9.45.89", 7777);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
BufferedReader br = new BufferedReader(new InputStreamReader(is));
bw.write("好久不见");
bw.newLine();
bw.flush();
String data = br.readLine();
System.out.println("服务器 -> " + data);
bw.close();
br.close();
socket.close();
}
}
服务器端
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
// 开启监听客户端连接,返回客户端连接
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
String data = br.readLine();
System.out.println("客户端 -> " + data);
bw.write("甚是想念");
bw.newLine();
bw.flush();
br.close();
bw.close();
socket.close();
serverSocket.close();
}
}
TCP编程实现客户端上传文件给服务器端
客户端
public class FileClient {
public static void main(String[] args){
Socket socket = null;
OutputStream outputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
socket = new Socket("127.0.0.1", 8888);
System.out.println("客户端启动");
outputStream = socket.getOutputStream();
bufferedInputStream = new BufferedInputStream(new FileInputStream("2.png"));
byte[] buffer = new byte[1024 * 8];
int len;
while ((len = bufferedInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (bufferedInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
System.out.println("发送完毕");
}
}
}
服务器端
public class FileServer {
public static void main(String[] args) {
ServerSocket listener = null;
Socket socket = null;
InputStream inputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
listener = new ServerSocket(8888);
socket = listener.accept();
System.out.println("服务器启动");
inputStream = socket.getInputStream();
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("1.png"));
byte[] buffer = new byte[1024 * 8];
int len;
while ((len = inputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer, 0, len);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (bufferedOutputStream != null) {
try {
bufferedOutputStream.close();
} catch (IOException e) {
System.out.println("缓冲流关闭失败");
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
System.out.println("输入流管理失败");
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (listener != null) {
try {
listener.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
System.out.println("接收完毕");
}
}
}
TCP实现多个客户端发送数据给服务端
客户端
public class Client {
public static void main(String[] args) {
Socket socket = null;
BufferedWriter bufferedWriter = null;
try {
socket = new Socket("127.0.0.1", 8888);
System.out.println("客户端启动");
OutputStream outputStream = socket.getOutputStream();
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
Scanner input = new Scanner(System.in);
while (true) {
String data = input.next();
bufferedWriter.write(data);
bufferedWriter.newLine();
bufferedWriter.flush();
if ("Bye".equals(data)) {
break;
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
System.out.println("流关闭失败");
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
System.out.println("流关闭失败");
}
}
}
}
}
服务器端
public class Server {
public static void main(String[] args) {
Socket socket = null;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8888);
System.out.println("服务器启动");
while (true) {
socket = serverSocket.accept();
System.out.println(socket.getInetAddress() + "->" + socket.getPort() + "进入群聊");
SocketThread socketThread = new SocketThread(socket);
socketThread.start();
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
System.out.println("流关闭失败");
}
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
System.out.println("流关闭失败");
}
}
}
}
}
服务器端多线程处理
public class SocketThread extends Thread{
Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedReader bufferedReader = null;
try {
InputStream inputStream = socket.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String data;
while ((data = bufferedReader.readLine()) != null) {
System.out.println(socket.getInetAddress() + "->" + socket.getPort() + ":说" + data);
if ("Bye".equals(data)) {
break;
}
}
System.out.println(socket.getInetAddress() + "->" + socket.getPort() + "退出群聊");
} catch (IOException e) {
System.out.println(socket.getInetAddress() + "->" + socket.getPort() + "退出群聊");
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
System.out.println("流关闭失败");
}
}
}
}
}