Java 网络编程。
TCP / UDP。
TCP。打电话。~ 连接 ~ 接了 ~ 通话。
UDP。发短信。~ 发送就完事了。~ 接收。
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
IP。
package com.geek.lesson00;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAddress {
public static void main(String[] args) {
// new InetAddress()
// 'InetAddress()' is not public in 'java.net.InetAddress'. Cannot be accessed from outside package
try {
// InetAddress localHost = InetAddress.getLocalHost();
// System.out.println("localHost = " + localHost);
// localHost = LAPTOP-0GJSKR6T/192.168.142.1
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
System.out.println("inetAddress1 = " + inetAddress1);
// inetAddress1 = /127.0.0.1
// 查询网站地址。
InetAddress inetAddress2 = InetAddress.getByName("baidu.com");
System.out.println("inetAddress2 = " + inetAddress2);
// inetAddress2 = baidu.com/39.156.69.79
InetAddress inetAddress3 = InetAddress.getByName("www.baidu.com");
System.out.println("inetAddress3 = " + inetAddress3);
// inetAddress3 = www.baidu.com/112.80.248.76
// 常用方法。
System.out.println(inetAddress1.getAddress());// [B@1b6d3586
System.out.println(inetAddress1.getCanonicalHostName());// 127.0.0.1
System.out.println(inetAddress1.getHostAddress());// 127.0.0.1
System.out.println(inetAddress1.getHostName());// 127.0.0.1
System.out.println(inetAddress2.getAddress());// [B@4554617c
System.out.println(inetAddress2.getCanonicalHostName());// 39.156.69.79
System.out.println(inetAddress2.getHostAddress());// 39.156.69.79
System.out.println(inetAddress2.getHostName());// baidu.com
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
端口。
端口表示计算机上的一个程序的进程。
-
不同的进程有不同的端囗号!用来区分软件!
-
0 ~ 65535
-
TCP,UDP:65535 * 2。tcp:80,udp:80。单个协议下, 端囗号不能冲突。
-
端口分类。
- 公有端口 0 ~ 1023。
HTTP:80。
HTTPS:443。- 程序端口 1024 ~ 49151。
Tomcat:8080。
MySQL:3306。
Oracle:1521。
netstat -ano | findstr “5900”
tasklist | findstr “” # 查看指定端口的进程。
public static void main(String[] args) {
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
System.out.println("inetSocketAddress = " + inetSocketAddress);
}
}
TCP 聊天。
- server。
package com.geek.lesson01;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
ByteOutputStream byteOutputStream = null;
try {
// 我得有以个地址。
serverSocket = new ServerSocket(9999);
// 等待客户端连接。
socket = serverSocket.accept();
// 读取客户端消息。
inputStream = socket.getInputStream();
// ~ ~ ~
// byte[] bytes = new byte[1024];
// int length;
// while ((length = inputStream.read(bytes)) != -1) {
// String msg = new String(bytes, 0, length);
// System.out.println(msg);
// }
// ~ ~ ~
// 管道流。
byteOutputStream = new ByteOutputStream();
byte[] bytes = new byte[1024];
int length;
while ((length = inputStream.read(bytes)) != -1) {
byteOutputStream.write(bytes, 0, length);
}
System.out.println(byteOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (byteOutputStream != null) {
byteOutputStream.close();
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- client。
package com.geek.lesson01;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClientDemo01 {
public static void main(String[] args) {
Socket socket = null;
OutputStream outputStream = null;
try {
// 要知道服务器的地址。
InetAddress serverIP = InetAddress.getByName("192.168.142.154");
// 端口号。
int port = 9999;
// 创建一个 Socket 连接。
socket = new Socket(serverIP, port);
// 发送消息。
outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
-
文件。
-
server。
package com.geek.lesson01;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServerDemo02 {
public static void main(String[] args) throws IOException {
// 创建服务。
ServerSocket serverSocket = new ServerSocket(9999);
// 监听客户端连接。
Socket socket = serverSocket.accept();// 阻塞式监听。
// 获取输入流。
InputStream inputStream = socket.getInputStream();
// 文件输出。
FileOutputStream fileOutputStream = new FileOutputStream(new File("recieve.jpg"));
byte[] bytes = new byte[1024];
int length;
while ((length = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, length);
}
fileOutputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
- client。
package com.geek.lesson01;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TCPClientDemo02 {
public static void main(String[] args) throws IOException {
Socket socket = null;
OutputStream outputStream = null;
// 要知道服务器的地址。
InetAddress serverIP = InetAddress.getByName("192.168.142.154");
// 端口号。
int port = 9999;
// 创建一个 Socket 连接。
socket = new Socket(serverIP, port);
// 创建一个输出流。
outputStream = socket.getOutputStream();
// 读取文件。
FileInputStream fileInputStream = new FileInputStream(new File("0.jpg"));
// 写出文件。
byte[] bytes = new byte[1024];
int length;
while ((length = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, length);
}
outputStream.close();
socket.close();
}
}
socket.shutdownOutput();// 我已经传输完了。
udp。
- server。
package com.geek.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpServerDemo01 {
public static void main(String[] args) throws IOException {
// 开放端口。
DatagramSocket datagramSocket = new DatagramSocket(9090);
// 接收数据包。
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
// 接收。
datagramSocket.receive(datagramPacket);
System.out.println(datagramPacket.getAddress());// /192.168.142.1
System.out.println(datagramPacket.getData());// [B@7b1d7fff
System.out.println(datagramPacket.getLength());// 9
System.out.println(datagramPacket.getOffset());// 0
System.out.println(datagramPacket.getPort());// 55109
System.out.println(datagramPacket.getSocketAddress());// /192.168.142.1:55109
// 关闭连接。
datagramSocket.close();
}
}
- client。
package com.geek.lesson03_udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpClientDemo01 {
public static void main(String[] args) throws IOException {
// 建立一个 Socket。
DatagramSocket datagramSocket = new DatagramSocket();
String msg = "你好。";
// 发送给谁。
InetAddress address = InetAddress.getByName("192.168.142.154");
int port = 9090;
// 建个包。
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, address, port);
// 发送包。
datagramSocket.send(datagramPacket);
// 关闭。
datagramSocket.close();
}
}
UDP 聊天。
- receiver。
package com.geek.chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiverDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(6666);
while (true) {
byte[] container = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(container, 0, container.length);
datagramSocket.receive(datagramPacket);// 阻塞式接受包裹。
// bye ~ 断开连接。
byte[] data = datagramPacket.getData();
String receiveData = new String(data, 0, data.length);
System.out.println(receiveData);
if ("bye".equals(receiveData)) {
break;
}
}
datagramSocket.close();
}
}
- sender。
package com.geek.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpSenderDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(8888);
// 准备数据。
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String data = bufferedReader.readLine();
byte[] bytes = data.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("192.168.142.154", 6666));
datagramSocket.send(datagramPacket);
if ("bye".equals(data)) {
break;
}
}
bufferedReader.close();
datagramSocket.close();
}
}
多线程。
- TalkReceiver。
package com.geek.chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TalkReceiver implements Runnable {
private DatagramSocket datagramSocket = null;
private int port;
private String msgFrom;
public TalkReceiver(int port, String msgFrom) {
this.port = port;
this.msgFrom = msgFrom;
try {
datagramSocket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
byte[] container = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(container, 0, container.length);
try {
datagramSocket.receive(datagramPacket);// 阻塞式接受包裹。
} catch (IOException e) {
e.printStackTrace();
}
// bye ~ 断开连接。
byte[] data = datagramPacket.getData();
String receiveData = new String(data, 0, data.length);
System.out.println(msgFrom + ":" + receiveData);
if ("bye".equals(receiveData)) {
break;
}
}
datagramSocket.close();
}
}
- TalkSend。
package com.geek.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TalkSend implements Runnable {
private DatagramSocket datagramSocket = null;
private BufferedReader bufferedReader = null;
private int fromPort;
private String toIp;
private int toPort;
public TalkSend(int fromPort, String toIp, int toPort) {
this.fromPort = fromPort;
this.toIp = toIp;
this.toPort = toPort;
try {
datagramSocket = new DatagramSocket(fromPort);
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
String data = null;
try {
data = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = data.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIp, this.toPort));
try {
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
if ("bye".equals(data)) {
break;
}
}
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
datagramSocket.close();
}
}
- TalkStudent。
package com.geek.chat;
public class TalkStudent {
public static void main(String[] args) {
// 开启两个线程。
new Thread(new TalkSend(7777, "localhost", 9999)).start();
new Thread(new TalkReceiver(8888, "老师")).start();
}
}
- TalkTeacher。
package com.geek.chat;
public class TalkTeacher {
public static void main(String[] args) {
// 开启两个线程。
new Thread(new TalkSend(5555, "localhost", 8888)).start();
new Thread(new TalkReceiver(9999, "学生")).start();
}
}