Java第十一次课程作业

时间: 2023-12-16 admin IT培训

Java第十一次课程作业

Java第十一次课程作业

1.仿照例15.4,编写基于TCP Socket的多客户/服务器通信程序。

package p1;import java.io.*;
import java.*;
public class TalkClient {public static void main(String args[]) {try{//向本机的4700端口发出客户请求Socket socket=new Socket("127.0.0.1",4700);//由系统标准输入设备构造BufferedReader对象BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));//由Socket对象得到输出流,并构造PrintWriter对象PrintWriter os=new PrintWriter(socket.getOutputStream());//由Socket对象得到输入流,并构造相应的BufferedReader对象BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));String readline;readline=sin.readLine(); //从系统标准输入读入一字符串while(!readline.equals("bye")){//若从标准输入读入的字符串为 "bye"则停止循环//将从系统标准输入读入的字符串输出到Serveros.println(readline);os.flush();//刷新输出流,使Server马上收到该字符串//在系统标准输出上打印读入的字符串System.out.println("Client:"+readline);//从Server读入一字符串,并打印到标准输出上System.out.println("Server:"+is.readLine());				readline=sin.readLine(); //从系统标准输入读入一字符串} //继续循环os.close(); //关闭Socket输出流is.close(); //关闭Socket输入流socket.close(); //关闭Socket}catch(Exception e) {System.out.println("Error"+e); //出错,则打印出错信息}}
}package p1;import java.io.*;
import java.*;class ServerThread extends Thread{Socket socket=null; //保存与本线程相关的Socket对象int clientnum; //保存本进程的客户计数public ServerThread(Socket socket,int num) { //构造函数this.socket=socket; //初始化socket变量clientnum=num+1; //初始化clientnum变量}public void run() { //线程主体try{String line;//由Socket对象得到输入流,并构造相应的BufferedReader对象BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));//由Socket对象得到输出流,并构造PrintWriter对象PrintWriter os=new PrintWriter(socket.getOutputStream());//由系统标准输入设备构造BufferedReader对象BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));//在标准输出上打印从客户端读入的字符串System.out.println("Client:"+ clientnum +is.readLine());//从标准输入读入一字符串line=sin.readLine();while(!line.equals("bye")){//如果该字符串为 "bye",则停止循环os.println(line);//向客户端输出该字符串os.flush();//刷新输出流,使Client马上收到该字符串//在系统标准输出上打印该字符串System.out.println("Server:"+line);//从Client读入一字符串,并打印到标准输出上System.out.println("Client:"+ clientnum +is.readLine());line=sin.readLine();//从系统标准输入读入一字符串}//继续循环os.close(); //关闭Socket输出流is.close(); //关闭Socket输入流socket.close(); //关闭Socket			}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息}}
}
public class MultiTalkServer{static int clientnum=0; //静态成员变量,记录当前客户的个数public static void main(String args[]) throws IOException {ServerSocket serverSocket=null;boolean listening=true;try{//创建一个ServerSocket在端口4700监听客户请求serverSocket=new ServerSocket(4700); 			}catch(IOException e) {System.out.println("Could not listen on port:4700.");//出错,打印出错信息System.exit(-1); //退出}while(listening){ //循环监听//监听到客户请求,根据得到的Socket对象和客户计数创建服务线程,并启动之new ServerThread(serverSocket.accept(),clientnum).start();clientnum++; //增加客户计数}serverSocket.close(); //关闭ServerSocket}
}

2.仿照例15.5,编写基于UDP数据报的多客户/服务器通信程序。

import java.io.*;
import java.*;class QuoteServerThread extends Thread//服务器线程
{  protected DatagramSocket socket=null;//记录和本对象相关联的DatagramSocket对象protected BufferedReader in=null;//用来读文件的一个Readerprotected boolean moreQuotes=true;//标志变量,是否继续操作public QuoteServerThread() throws IOException {//无参数的构造函数this("QuoteServerThread");//以QuoteServerThread为默认值调用带参数的构造函数}public QuoteServerThread(String name) throws IOException {super(name); //调用父类的构造函数socket=new DatagramSocket(4445);//在端口4445创建数据报套接字		in= new BufferedReader(new InputStreamReader(System.in));}	public void run() //线程主体{while(moreQuotes) {try{byte[] buf=new byte[256]; //创建缓冲区DatagramPacket packet=new DatagramPacket(buf,buf.length);//由缓冲区构造DatagramPacket对象socket.receive(packet); //接收数据报				//打印出客户端发送的内容System.out.println("Client : "+new String(packet.getData())); //从屏幕获取输入内容,作为发送给客户端的内容String dString= in.readLine();    //如果是bye,则向客户端发完消息后退出if(dString.equals("bye")){moreQuotes=false;}buf=dString.getBytes();//把String转换成字节数组,以便传送//从Client端传来的Packet中得到Client地址InetAddress address=packet.getAddress();int port=packet.getPort(); //端口号//根据客户端信息构建DatagramPacketpacket=new DatagramPacket(buf,buf.length,address,port);socket.send(packet); //发送数据报}catch(IOException e) { //异常处理e.printStackTrace(); //打印错误栈moreQuotes=false; //标志变量置false,以结束循环}}socket.close(); //关闭数据报套接字}	
}public class QuoteServer{public static void main(String args[]) throws java.io.IOException{new QuoteServerThread().start();//启动一个QuoteServerThread线程}
}package ob1;import java.io.*;
import java.*;class QuoteServerThread extends Thread//服务器线程
{  protected DatagramSocket socket=null;//记录和本对象相关联的DatagramSocket对象protected BufferedReader in=null;//用来读文件的一个Readerprotected boolean moreQuotes=true;//标志变量,是否继续操作public QuoteServerThread() throws IOException {//无参数的构造函数this("QuoteServerThread");//以QuoteServerThread为默认值调用带参数的构造函数}public QuoteServerThread(String name) throws IOException {super(name); //调用父类的构造函数socket=new DatagramSocket(4445);//在端口4445创建数据报套接字		in= new BufferedReader(new InputStreamReader(System.in));}	public void run() //线程主体{while(moreQuotes) {try{byte[] buf=new byte[256]; //创建缓冲区DatagramPacket packet=new DatagramPacket(buf,buf.length);//由缓冲区构造DatagramPacket对象socket.receive(packet); //接收数据报				//打印出客户端发送的内容System.out.println("Client : "+new String(packet.getData())); //从屏幕获取输入内容,作为发送给客户端的内容String dString= in.readLine();    //如果是bye,则向客户端发完消息后退出if(dString.equals("bye")){moreQuotes=false;}buf=dString.getBytes();//把String转换成字节数组,以便传送//从Client端传来的Packet中得到Client地址InetAddress address=packet.getAddress();int port=packet.getPort(); //端口号//根据客户端信息构建DatagramPacketpacket=new DatagramPacket(buf,buf.length,address,port);socket.send(packet); //发送数据报}catch(IOException e) { //异常处理e.printStackTrace(); //打印错误栈moreQuotes=false; //标志变量置false,以结束循环}}socket.close(); //关闭数据报套接字}	
}public class QuoteServer{public static void main(String args[]) throws java.io.IOException{new QuoteServerThread().start();//启动一个QuoteServerThread线程}
}

3.基于TCP Socket的C/S通信与基于UDP数据报的C/S通信有哪些区别?Java分别提供了哪些支持?
TCP:
特点:传输量大,可靠性强
传输数据可靠性:TCP是一个可靠的协议,能确保接收方完全正确地获取发送方发出的消息
通讯方式:传输数据前需要建立连接,发送方与接收方在连接之上传输数据
传输数据量:数据量大,可靠性强
JAVA支持:Socket,ServerSocket
UDP:
特点:UDP操作简单,传输效率高
传输数据可靠性:UDP是一个不可靠的协议,发送方发送的数据报不保证按相同次序到达也不能保证接收方收到
通讯方式:传输数据有大小限制(数据报最大64Kb)
传输数据量:操作简单,传输效率高
JAVA支持:DatagramSocket,DatagramPacket