没有接触通信的时候觉得几台电脑之间通信很神秘,那么要实现通信一定很难。但是,从接触通信的一些基本的类到现在可以实现基本的网络通信,并可以传输文件和实现网络画图板,觉得通信并没有自己想象的那么难。
通信主要是写出服务器和客户机,然后在知道对方IP的条件下,在指定的端口上建立连接,获得连接对象后,使用其出入输出流进行一字节为单位的数据传输。
一.编写服务器三步骤
第一步:实例化一个服务器:SocketServer server=new SocketServer("端口");
第二步:等待服务器的连接client=server.recept();
第三步:实例化输入输出流 outputstream ous=client.getOutputstream();i
nputstream ous=client.getInputstream();
第四部:开始进入读取程序
二.编写客户机的步骤
第一步:实例化一个客户机Socket socket=new Socket();
第二步:实例化输入输出 流 outputstream ous=client.getOutputstream();inputstream ous=client.getInputstream();
第三部:开始进入处理程序。
注意:
1----服务器在接入一个客户机之后要循环等待,需要放在死循环中。
2----服务器需要同时处理多个客户机 时,需要给每个客户机建立一个服务器线程
3----读取消息和发送消息时都应该和客户机定义好规则 ,并且都必须遵守次读写规则。
4----突然关闭客户机可能陷入死循环要加一行当读入的数据为null时的处理语句.
package newtest; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * 创建服务器线程类,该类继承自Thread * @author Administrator * */ public class ServerThread extends Thread{ private Socket client;//服务器连接对象 private OutputStream out;//输出流对象 private InputStream in;//输入流对象 /** * 构造方法,传入该线程要处理的连接对象 * @param lient:要处理的连接对象 */ public ServerThread(Socket client){ this.client=client; } /** * 重写线程的Run方法 */ public void run(){ //处理连接的方法 ProcessChat(); } /** * 处理连接的方法 */ private void ProcessChat() { try { out=client.getOutputStream();//获得相应的输出流对象 in=client.getInputStream();//获得相应的输入流对象 SendMsg("欢迎来到服务器"); String str=""; str=Getmsg(); while(!str.equals("bye")){ System.out.println("client_say:"+str); SendMsg("服务器收到:"+str); str=Getmsg(); } out.write(str.getBytes()); client.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 从客户机获取信息的方法 * @return * @throws IOException */ private String Getmsg() throws IOException { StringBuffer srb=new StringBuffer(); int i=in.read(); while(i!=13){//当用户打出一个回车符时,表示一句话输入完毕 srb.append((char)i); i=in.read(); } return srb.toString().trim();//返回所对应的出去空格后的字符串 } /** * 向客户机发送信息的方法 * @param string:要发送的信息 */ private void SendMsg(String str) { str=str+"\r\n"; try { out.write(str.getBytes()); out.flush();//强制输出 } catch (IOException e) { e.printStackTrace(); } } }
package ChatForUI;
import java.awt.Color; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; /** * 创建客户机线程类,该类继承自Thread类 * @author Administrator * */ public class ClientThread extends Thread{ private int port;//端口 private Socket client;//连接对象 private InputStream in;//输入信息流 private OutputStream out;//输出信息流 private DataInputStream dins; private DataOutputStream dout; private ClientUI cui;//客户机界面 private Shape shape;//图形对象 /** * 构造方法 * @param cui * @param port:端口 */ public ClientThread(int port, ClientUI cui){ this.port=port; this.cui=cui; try { client=new Socket("localhost",port);//实例化客户端 in=client.getInputStream();//得到对应的输入信息流对象 out=client.getOutputStream();//得到对应的输出信息流对象 //将输出输入流都包装为DataInputStream和DataOutputStream以方便读取原始数据类型 dins=new DataInputStream(in); dout=new DataOutputStream(out); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 重写run方法 */ public void run(){ try { String str_msg=""; int[] deawIf=new int[8]; int[] FCdata=new int[5]; while((!"bye".equals(str_msg))&&!(str_msg==null)){ str_msg=GetMsg(); if(str_msg.equals("验证失败")){ cui.jta_showmsg.append("服务器已经断开\r\n"); cui.jb_port.setText("连接"); this.CloseTh();//关闭本线程 return; } } } catch (IOException e) { e.printStackTrace(); } } /** * 接受信息的方法 * @throws IOException */ protected String GetMsg(){ try { String str = readmsg(); cui.jta_showmsg.append(str+"\r\n"); return str; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 向对应的服务器发送信息的方法 * @param msg:要发送的信息 * @throws IOException */ protected void SendMsg(String msg) throws IOException { msg=msg+"\r\n"; dout.writeChars(msg); dout.flush(); cui.jta_showmsg.append(msg);//将信息显示到显示信息的区域 cui.jta_msg.setText(null); } /** * 创建读取一行信息的方法 * @throws IOException :抛出IO异常 * @return:读到的一行字符串 */ private String readmsg() throws IOException { StringBuffer srb=new StringBuffer(); int i=dins.readChar(); while(i!='\n'){//当用户打出一个回车符时,表示一句话输入完毕 srb.append((char)i); i=dins.readChar(); } return srb.toString().trim();//返回所对应的出去空格后的字符串 } /** * 关闭该线程的方法 */ public void CloseTh() { try { client.close(); this.stop(); } catch (IOException e) { e.printStackTrace(); } } }