实验十 网络程序设计

一、实验目的

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();
    }
}

运行结果:

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一共包括10个以上的聊天程序版本!绝对物有所值! 为感谢大家长期的支持,我将下载所需的资源分下调为2。网络聊天程序设计(可选)  实验要求 1、分析典型网络聊天应用软件(如QQ、MSN等)的实现原理,模拟设计一套网络聊天应用程序,必须实现以下功能: ①按照C/S结构分别设计服务端程序和客户端程序; ②服务端通过图形用户界面实现对服务器的控制,负责维护用户帐户和用户群,并维护用户信息、维持客户端之间的端对端通信和群聊通信、适时维护用户在线信息,并能够发送广播消息。 2、增加尽可能多的功能,用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 3、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。  实验提示 1、客户端之间的通信是通过服务器进行转发的,对于两个客户端,服务器需要创建两个套接字分别维持与客户端之间的连接。当客户端需要向另一个客户发送消息时,它首先将消息发送到服务器,由服务器根据目标用户帐户转发到目标主机。 2、群聊是采用多播技术实现的,也可以采用单播技术实现,但是服务器开销会增加。具体说来,若采用组播技术,当服务端收到来自一个客户端的消息后,向预先分配的该组组播地址转发该消息。若采用单播技术,服务端需要向该组内的所有客户端一一转发该消息。 3、广播消息通过广播方式发送由服务端创建的消息。 4、服务端根据客户的连接和断开情况,实时向其它客户端发送用户在线信息。 实验题目二:自选网络通信程序设计(可选)  实验要求 可以自选与网络通信相关的设计题目,要求如下: 1、在确定实验题目、设计内容以及设计功能指标要求后,向实验指导教师提交书面申请,由实验指导教师根据所选实验题目的难度和工作量确定立题后方能开始实验。 2、选择的实验题目必须具有一定综合性,并能够利用网络通信原理加以解决,同时需要具备一定的工作量。 3、设计的结果要求用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 4、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。 5、严禁抄袭别人成果,但可以部分借鉴。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值