标签:多线程技术 工作 连接 catch img table accept exti 生成
码云地址:https://gitee.com/changchundehui/16012008_li_xue_examination_iv
使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
要求:
1.客户端从控制台进行输入,并将客户端的输出内容和时间保存到“学号.txt”文件中
2.服务器端读取到客户端的程序后,给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到文本文件中
3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个“学号_ip.txt”的文件
4..提交文件结果包括:代码,通信后生成的txt文件
一.设计思路:使用多线程技术和套接字写一个聊天室程序,客户可以输入圆的半径并发送给服务器,服务器把计算出的圆的面积返回给客户。因此可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户---服务器的交互计算,来完成任务。
二.运用到的知识点:使用多线程,使用Socket类的构造方法Socket()创建一个套接字对象,使用connect方法,可以使用SocketAddress 的子类InetSocketAddress 创建一个对象,InetSocketAddress 的构造方法是public InetSocket Address(InetAddress addr,int port)。
Client.java
import java.io.*; import java.net.*; import java.util.*; public class Client_Main{ public static void main(String args[]){ Scanner scanner =new Scanner(System.in); Socket mysocket=null; DataInputStream in =null; DataOutputStream out=null; Thread readData; Read read =null; try{mysocket =new Socket(); read =new Read(); readData =new Thread(read);//负责读取信息的线程 System.out.print("输入服务器的IP:"); String IP =scanner.nextLine(); System.out.print("输入服务器的IP:"); int port =scanner.nextInt(); if(mysocket.isConnected()){} else{ InetAddress address =InetAddress.getByName(IP); InetSocketAddress socketAddress =new InetSocketAddress (address,port); mysocket.connect(socketAddress); in=new DataInputStream(mysocket.getInputStream()); out =new DataOutputStream(mysocket.getOutputStream()); read.setDataInputStream(in); readData.start();//启动负责读取信息的线程 } } catch(Exception e){ System.out.println("服务器已断开"+e); } System.out.print("输入圆的半径(放弃请输入N):"); while(scanner.hasNext()){ double radius=0; try{ radius =scanner.nextDouble(); } catch(InputMismatchException exp){ System.exit(0); } try{ out.writeDouble(radius);//向服务器发送信息 } catch(Exception e){} } } }
Read.java
import java.io.*;
public class Read implements Runnable{
DataInputStream in;
public void setDataInputStream(DataInputStream in){
this.in=in;
}
public void run(){
double result =0;
while(true){
try{
result =in.readDouble();//读取服务器发送来的信息
System.out.println("圆的面积:"+result);
System.out.print("输入圆的半径(放弃请输入N):");
}
catch(IOException e){
System.out.println(“与服务器已断开"+e);
break;
}
}
}
}
Server_Main.java
import java.io.*;
import java.net.*;
import java.util.*;
public class Server_Main{
public static void main(String args[]){
ServerSocket server =null;
ServerThread thread;
Socket you =null;
while(true){
try{server =new ServerSocket(2010);
}
catch(IOException el){
System.out.println("正在监听");//ServerSocket 对象不能重复创建
}
try{System.out.println("等待客户呼叫:");
you =server.accept();
System.out.println("客户的地址:"+you.getInetAddress());
}
catch(IOException e){
System.out.println("正在等待客户");
}
if(you!=null){
new ServerThread(you).start();//为每个客户启动一个专门的线程
}
}
}
}
class ServerThread extends Thread{
Socket socket;
DataOutputStream out =null;
DataInputStream in =null;
String s =null;
ServerThread(Socket t){
socket =t;
try{
out =new DataOutputStream(socket.getOutputStream());
in =new DataInputStream(socket.getInputStream());
}
catch(IOException e){}
}
public void run(){
while(true){
try{double r=in.readDouble();//阻塞状态,除非读取到信息
double area =Math.PI*r*r;
out.writeDouble(area);
}
catch(IOException e){
System.out.println("客户离开");
return;
}
}
}
}
运行结果:
总结:这一学期的java 课程即将结束了,因为掌握的代码量太少,知识点掌握的不好,所以在编写程序的过程中没有思路,不知道该从哪开始写,第四次的考核代码也是看书上的,在运行结果的时候也不对。
| 博客字数 | 238 |
| 代码字数 | 120 |
课堂练习码云地址:https://gitee.com/changchundehui/16012008-
标签:多线程技术 工作 连接 catch img table accept exti 生成
原文地址:https://www.cnblogs.com/changchundehui/p/10111281.html