服务器端:
//这个类用来表示Socket编程的服务器端:接收客户端的请求和给客户端做出响应
//1,启动服务器
//2,接收客户端的连接请求
//3,接收客户端发来的数据
public class Server {
public static void main(String[] args) throws Exception {
// 1,启动服务器,并且在8000端口,等待客户端连接
ServerSocket server = new ServerSocket(8000);
// 2,接收客户端的连接请求,并建立数据通信通道
Socket socket = server.accept();
// 3,获取到读取流,读取客户端发来的数据
InputStream in = socket.getInputStream();
//从读取流中,获取发来的hello,需要读取5次
for (int i = 0; i < 5; i++) {
// int b = in.read();//这样子读取是把字符转成数字了
char c = (char)in.read();//为了直接读取字符
System.out.print(c);//同行展示
}
//5,给客户端发送数据
OutputStream out = socket.getOutputStream();
out.write("world".getBytes());
out.flush();
//4,释放资源
in.close();
server.close();
}
}
客户端:
//这个类用来表示Socket编程的客户端:接收服务器发来的数据和给服务器发送数据
//1,指定要连接的服务器
//2,给服务器发送hello
public class Client {
public static void main(String[] args) throws Exception {
// 1,指定要连接的服务器,并同时指定服务器的ip地址(如果是本机ip地址是固定值,如下)和端口号
Socket socket = new Socket("127.0.0.1",8000);
// 2,获取到输出流,并给服务器发送hello
OutputStream out = socket.getOutputStream();
//把hello字符串变成字节数组byte[]进行写出
out.write("hello".getBytes());
out.flush();//把数据刷出去,但是不关流
//4,读取从服务器发回来的数据
InputStream in = socket.getInputStream();
for (int i = 0; i < 5; i++) {
// int b = in.read();
//一个一个读取流中的字符
char b = (char)in.read();
System.out.print(b);//同行展示
}
//3,释放资源
in.close();
socket.close();
}
}
回声案例:
服务器端:
//这个类用来做回声案例的服务器端
//1,启动服务器
//2,接收客户端的连接请求
//3,给每个客户端分配对应的话务员
//4,话务员:主要负责和客户端沟通I/O
public class Server2 {
// 创建方法,负责1和2和3
public void service() {
// 在服务器端,使用多线程开发,让每个客户端之间不用等待,可以并发访问,提高服务器的执行效率,提高吞吐量
new Thread() {// 匿名对象+匿名内部类(重写run方法)
// 把业务写入run()中
@Override
public void run() {
try {
// 1,启动服务器,并在8000端口处等待客户端连接
ServerSocket server = new ServerSocket(8000);
System.out.println("服务器启动成功...");
while (true) {
// 2,一直接收所有客户端的连接请求
Socket socket = server.accept();
System.out.println("客户端连接成功...");
// 3,给每个客户端分配对应的话务员,1V1
HuaWuThread t = new HuaWuThread(socket);
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();// 启动线程
}
// 4,话务员:主要负责和客户端沟通I/O
class HuaWuThread extends Thread {
Socket socket;// 保持通话
public HuaWuThread(Socket socket) {
this.socket = socket;
}
// 把业务放入run(),一直读取客户端发来的数据,并作出回声数据
@Override
public void run() {
try {
//读取一行BufferedReader,并且写出一行PrintWriter
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream())) ;
//读取客户端发来 的一行数据
String line;//定义变量,记录读取到的一行的数据
while( ( line = in.readLine() ) != null) {//只要有数据就一直读
System.out.println("客户端发来的数据是:"+line);
System.out.println("请输入您想要给客户端回声的数据:");
String input = new Scanner(System.in).nextLine();
out.println(input);//给客户端做的回声数据
out.flush();//把数据刷出去
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Server2 s = new Server2();
s.service();
}
}
客户端:
//这个类用来做回声案例的客户端
//1,连接指定的服务器
//2,一直给服务器发送数据
//3,一直接收服务器回声的数据
public class Client2 {
public static void main(String[] args) {
try {
// 1,连接指定的服务器,同时指定服务器的ip和端口号
Socket socket = new Socket("127.0.0.1",8000);
// 2,一直给服务器发送数据
while(true) {
//向服务器写出一行数据,并且读取服务器回声回来的一行数据
PrintWriter out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 3,一直发送一直读取
System.out.println("请输入您想要给服务器端发送的数据:");
String input = new Scanner(System.in).nextLine();
out.println(input);//向服务器发送了指定数据
out.flush();//把数据刷出去
String line = in.readLine();//读取回声数据
System.out.println("服务器的回声数据是:"+line);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}