本题考察了socket通信、多线程并发、读取文件,io流、面向对象封装,继承、类型转换等知识点。
client代码:
public void start(){ Socket socket; String ss=""; //调用同一包内ReadProperties类的ReadProperties()方法 ReadProperties rp=new ReadProperties(); rp.ReadProperties(); String IP=rp.getIP();//从a.properties中获得ip //从a.properties中获得port,将String类型强转成int类型 int port=Integer.parseInt(rp.getPort()); try { socket=new Socket(IP,port); // System.out.println("IP="+IP); KeFuduanjie kf=new KeFuduanjie(socket);//客户端接收消息 //客户端发送消息【kfs线程发送消息】 KeFuWuFasong kfs = new KeFuWuFasong(socket); kfs.setName("kfs"); ClientReadFile crf=new ClientReadFile(socket);//从硬盘读取文件 kf.start(); kfs.start(); crf.start(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class KeFuduanjie extends Thread{ Socket socket; String ss; BufferedReader br; public KeFuduanjie(Socket socket){ this.socket=socket; try { br=new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //负责接收服务端来的消息 public void run(){ while(true){ try { ss=br.readLine(); System.out.println(socket.getLocalPort()+"服务器---->客服端: "+ss); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class KeFuWuFasong extends Thread{ Socket socket; BufferedWriter bw; BufferedReader br; // OutputStream os; // String word; public KeFuWuFasong(Socket socket){ this.socket=socket; try { // os=socket.getOutputStream();//2将socket转换成IO流 br=new BufferedReader(new InputStreamReader(System.in));//不从控制台输入怎样写死? bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // word="hi"; // Thread.sleep(2000); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run(){ while(true){ try { // os.write(word.getBytes()); bw.write(br.readLine()); bw.newLine(); bw.flush();//或用bw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class ClientReadFile extends Thread{ Socket socket; DataInputStream dis; DataOutputStream dos; public ClientReadFile(Socket socket){ this.socket=socket; try { dis=new DataInputStream(new FileInputStream("F:/commons-logging.properties")); dos=new DataOutputStream(socket.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run(){ // while(true){ try { Thread.sleep(10000); System.out.println("wait 10s"); int i=0; byte[] b=new byte[1024]; String s; while((i=dis.read(b))>0){ s=new String(b,"gbk"); dos.write(b,0,i); System.out.println("读取的文件信息:"+s); } dos.flush();//或用bw.close(); dis.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // } }
server端代码:
public class Server { public static void main(String[] args) { Server server=new Server(); server.start(); } public void start(){ ReadProperties rp=new ReadProperties(); rp.ReadProperties(); int port=Integer.parseInt(rp.getPort());//2014-4-9将String类型强转成int类型 try { ServerSocket ss=new ServerSocket(port); Socket socket = null; ServerToClientThread stct = null; while(true){ socket = ss.accept(); //迎接(接收)客户端的Socket访问 stct = new ServerToClientThread(socket); //分配一个新线程负责和信赖的Socket沟通 stct.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class ServerToClientThread extends Thread{ Socket socket; BufferedReader br; BufferedWriter bw; String s; //建立的同时,和客户端的Socket建立输入、输出流 public ServerToClientThread(Socket socket){ this.socket = socket; try { bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); } catch (IOException e) { e.printStackTrace(); } } public void run(){ ServerReceiveFromClient srfc = new ServerReceiveFromClient(socket); srfc.start(); while(true){ try { bw.write("欢迎光临。"); bw.newLine(); bw.flush(); Thread.sleep(10*1000); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class ServerReceiveFromClient extends Thread{ Socket socket; BufferedReader br; String s; public ServerReceiveFromClient(Socket socket){ this.socket = socket; try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { e.printStackTrace(); } } public void run(){ while(true){ try { s = br.readLine(); System.out.println("客户端:"+socket.getInetAddress().getHostAddress()+"发送了:"+s); } catch (Exception e) { e.printStackTrace(); } } } }
properties文件内容:
ip=127.0.0.1
port=8080