网络编程
网络编程的实质就是已经建立好的计算机网络的基础之上,通过使用程序控制的特定方式,让两个(或多个)设备(例如计算机)之间进行数据传输。
java中的网络编程并不要求我们之前对计算机网络的知识有那么深入的研究,只需对网络的概念有基本的认识,并了解IP地址、端口号、URL等内容,这样就能够学习并使用JDK中提供的网络编程的API
java中和网络编写相关的API都在java.net包下面
C/S架构的全称是Client/Server,即客户端服务器端架构,客户端包含一个或多个在用户的电脑上运行的程序,而服务器端可以使用Socket来实现,服务器端的程序通过Socket与客户端的程序通信。
C/S 架构也可以看做是胖客户端架构,因为客户端需要实现很多的业务逻辑和界面展示功能。这种架构中,作为客户端的部分需要承受很大的压力,因为显示逻辑和事务处理都包含在其中。
优点:
C/S架构的界面和操作可以很丰富。
安全性能可以很容易保证。
响应速度较快。
缺点:
适用面窄,通常用于局域网中。
用户群固定,由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
维护成本高,软件进行一次升级,则所有客户端的程序都需要改变。
测试客户端与服务器端通信
Server:
package com.work;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
public static void main(String[] args) {
ServerSocket server = null;
Socket sock = null;
try {
server = new ServerSocket(7777);
System.out.println("服务器已经启动");
while (true) {
sock = server.accept();
System.out.println("ip地址是:" + sock.getInetAddress());
System.out.println("端口号是:" + sock.getPort());
Thread t1 = new MyThread(sock);
t1.start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class MyThread extends Thread {
public Socket sock;
public MyThread(Socket sock) {
this.sock = sock;
}
public synchronized void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));
out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), "gbk"));
String line = null;
while (!"bye".equals(line = in.readLine())) {
out.println(Thread.currentThread().getName() + ",你好" + line);
out.flush();
System.out.println("客户端发送的" + Thread.currentThread().getName() + ":" + line);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Client
package com.work;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class client1 {
@SuppressWarnings("resource")
public static void main(String[] args) {
PrintWriter out = null;
BufferedReader in = null;
try {
Socket sock = new Socket("127.0.0.1", 7777);
out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), "gbk"));
in = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));
while (true) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入要发送给服务器的话:");
String str = scan.nextLine();
out.println(str);
out.flush();
String line = in.readLine();
System.out.println("接收到服务器的:" + line);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果分析:
1、 用Telnet测试:
(1)先开启服务器
Telnet远程访问:
再次启动一个客户端
输入bye结束通信:
运用client通信:
下期再见!