一、实验目的
1、掌握网络通信的基础知识及Java对网络通信的支持
2、学习URL 和InetAddress类的应用
3、掌握基于底层Scoket的有连接和无连接的网络通信方法
二、实验内容
1、客户端向服务器发送请求,而服务器将接收发送给它的请求并将其写入文件。
完成客户端的步骤如下:
(1) 创建一个具有服务器IP地址和端口号的Socket对象。
Socket soc=new Socket("localhost",4001);
(2) 客户端接受输入。
BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入消息至服务器"); String message=""; String temp; while(!(temp=br.readLine()).equals("send")){ message=message+temp+"\n"; } |
(3)客户端向服务器发送请求。
PrintStream ps=new PrintStream(soc.getOutputStream());
ps.print(message);
(4)关闭PrintStream和Socket对象
ps.close();
soc.close();
完成服务器端程序代码步骤如下:
(1)ServerSocket对象等待客户端在端口号4001上建立连接。
ServerSocket ss=new ServerSocket(4001);
(2)一旦客户端建立连接,accept()方法即被调用以接受连接。
Socket soc=ss.accept();
(3)服务器接受请求。
BufferedReader br=new BufferedReader(new InputStreamReader(soc.getInputStream())); String message=""; String temp=null;
do{ temp=br.readLine(); if(temp==null){ break; } message=message+temp; }while(true); br.close(); |
(4)服务器将请求写入文件。
PrintStream ps=new PrintStream(new FileOutputStream("message.txt")); ps.println(message); ps.close(); |
WriteClient类:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class WriteClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 4001);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入消息至服务器");
String message="";
String temp;
while(!(temp=br.readLine()).equals("send")){
message=message+temp+"\n";
}
PrintStream ps=new PrintStream(socket.getOutputStream());
ps.print(message);
ps.close();
socket.close();
}
}
WriteServer类:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class WriteServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(4001);
Socket socket = serverSocket.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message="";
String temp=null;
do{
temp=br.readLine();
if(temp==null){
break;
}
message=message+temp;
}while(true);
br.close();
PrintStream ps=new PrintStream(new FileOutputStream("message.txt"));
ps.println(message);
ps.close();
}
}
运行结果:
自从生成message.txt
2、编写一个客户/服务器程序,服务器的功能是计算圆的面积。客户端将圆的半径发送给服务器端,服务器端计算得出的圆面积发送给客户端,并在客户端显示。
Client类:
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("客户端启动...");
// 客户端
// 创建一个具有服务器IP地址和端口号的Socket对象
Socket socket = new Socket("localhost", 4001);
// 读取服务端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
//向服务器端发送数据
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
// 客户端接收输入
System.out.println("请输入圆的半径:");
String radius = new BufferedReader(new InputStreamReader(System.in)).readLine();
output.writeUTF(radius);
String area = input.readUTF();
System.out.println("服务端返回的面积:" + area);
output.close();
input.close();
socket.close();
}
}
Server类:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("服务器启动...");
// 服务器端
ServerSocket serverSocket = new ServerSocket(4001);
Socket socket = serverSocket.accept();
// 读取客户端数据
DataInputStream input = new DataInputStream(((Socket) socket).getInputStream());
String radius = input.readUTF();
System.out.println("客户端发过来的内容:" + radius);
// 向客户端回复信息
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
double area = Math.PI * Math.pow(Double.parseDouble(radius), 2);
output.writeUTF(String.valueOf(area));
input.close();
output.close();
}
}
运行结果:
3*、按以下要求设计一个基于TCP 服务器实现聊天程序:
(1)客户端登录时,提供登录的昵称,并将信息发送到服务器上。
(2)服务器收到信息后,转发给所有在线客户,因此服务器端支持多线程,即实现多人聊天。
ReadThread类:
import java.io.DataInputStream;
import java.io.IOException;
public class ReadThread implements Runnable {
private DataInputStream input;
public ReadThread(DataInputStream input) {
this.input = input;
}
@Override
public void run() {
try {
String message;
while ((message = input.readUTF()) != null) {
System.out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
SendThread类:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class SendThread implements Runnable {
private DataOutputStream output;
public SendThread(DataOutputStream output) {
this.output = output;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 客户端发送信息
String line;
while ((line = br.readLine()) != null) {
if ("bye".equals(line)) {
br.close();
output.close();
break;
}
output.writeUTF(line);
output.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ChatServer类:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ChatServer {
public static void main(String[] args) {
int count = 0;
List<Socket> socketList = Collections.synchronizedList(new ArrayList<>());
while (true) {
System.out.println("服务器等待建立连接...");
try (ServerSocket serverSocket = new ServerSocket(4001)) {
Socket socket = serverSocket.accept();
count++;
socketList.add(socket);
new Thread(new ServerThread(socket, count, socketList)).start();
System.out.println("连接成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ServerThread类:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
public class ServerThread implements Runnable {
private int count;
private List<Socket> socketList;
Socket socket;
public ServerThread(Socket socket, int count, List<Socket> socketList) {
this.socket = socket;
this.count = count;
this.socketList = socketList;
}
@Override
public void run() {
try {
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String strNow = now.format(formatter);
String str = "ip:" + socket.getInetAddress().getHostAddress() + "-->主机" + count + "号,port:" + socket.getPort();
output.writeUTF("Welcome" + "\t" + str + "\t" + strNow);
output.flush();
DataInputStream input = new DataInputStream(socket.getInputStream());
String line;
while ((line = input.readUTF()) != null) {
if (!socketList.isEmpty()) {
for (Socket s : socketList) {
if (!s.equals(socket)) {
DataOutputStream outputStream = new DataOutputStream(s.getOutputStream());
outputStream.writeUTF(str + ":" + line);
outputStream.flush();
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ChatClient类:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class ChatClient {
public static void main(String[] args) throws IOException {
System.out.println("客户端启动中...");
Socket socket = new Socket("localhost", 4001);
DataInputStream input = new DataInputStream(socket.getInputStream());
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
SendThread st = new SendThread(output);
ReadThread rt = new ReadThread(input);
// 启动发送接收线程
new Thread(new SendThread(output)).start();
new Thread(new ReadThread(input)).start();
}
}
运行结果: