Java 网络编程
网络基础
IP,端口号,域名,7 层结构,协议(TCP,UDP)
这些东西,早就聊熟于心了,如果要复习,那就去复习计算机网络的笔记
这里,要强调一点,网络传输,只能传输字节,所以输出的时候,只能使用字节流
网络编程
现在网络编程中,UDP 的使用越来越少了,仅限于了解。如果想复习,可以去看之前的 Java 网络编程笔记,里面对所有网络编程的相关类,都有详细的描述
Socket
Java 中,TCP 连接,是使用 Socket 实现的
单线程 Socket 实验
注意!
因为网路传输中,只能传输字节,所以输出只能使用字节流!!!
使用字符流,是会报错的!!
多线程连接
ServerSocket 的 accept()
方法每次在执行前,都会阻塞,等待新的客户端连接
一旦有新的客户端连接,我们就新建一个线程,专门处理这个客户端和服务器的连接
服务器:
public class TServer {
private static int count=0;
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(19191);
while (true) {
/**
* 每次执行 accept()的时候,都会阻塞
* 等待新的客户端连接
* 只有新的客户端连接,才会往下走
*/
Socket socket = ss.accept();
Thread t = new Thread(new ClientConn(socket), "连接-" + (++count));
t.start();
}
}
}
class ClientConn implements Runnable {
private Socket socket;
public ClientConn(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
InputStream ips = null;
try {
ips = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
OutputStream ops = null;
try {
ops = socket.getOutputStream();
PrintStream ps = new PrintStream(ops);
ps.println("服务器:你好客户端");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
public class TClient {
public static void main(String[] args) throws IOException, InterruptedException {
Socket socket = new Socket("127.0.0.1", 19191);
while (true) {
Thread.sleep(1000);
OutputStream ops = socket.getOutputStream();
PrintStream ps = new PrintStream(ops);
ps.println("客户端:你好服务器");
InputStream ips = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
System.out.println(br.readLine());
}
}
}
先启动服务器,再启动客户端,我们就可以看到,服务器和客户端在通信了: