`

java聊天--(仅供自己收藏)

    博客分类:
  • java
阅读更多

这是刚开始学习java网络编程的时候做的一个东东,,局域网聊天器,可以在局域网内,和小伙伴聊天,共同画图(游戏原型)。先上图吧



 

一,首先讲解下基本知识,建立网络连接,你首先得有服务器和客户端,

1,服务器:ServerSocket s=new ServerSocket(n);这样就建立好一个端口号n的服务器,如果把你的电脑比作公寓,端口号类似于你的房间号。服务器创建好后,你得等待客户端连接,Socket so=s.accept();这样就能获取到连接进来的客户端(如果当前么有人连进来,他就会阻塞在当前,不会执行下面的代码),然后你就得获取他的输入输出流,用来传送和接收数据,InputStream is=so.GetinpputStream();Outputstream ou=so.getOutPutstream();

2,客户端:Socket s=new Socket("ip",端口号);ip就是你连接的那台服务器的电脑的ip地址,端口号就是你创建服务器的那个端口号,也就是说你得先找到公寓地址,然后再去找房间,这样就连接好了,同样的获取输入输出流,用来传送接收数据。

二,以上就是基本知识点,现在开始实例代码

首先看界面代码

 

Java代码  收藏代码
  1. public  class fu extends JFrame{  
  2.     public Test t=new Test();  
  3.     private static JTextArea jt3;  
  4.     public JTextField jt2;  
  5.     static Graphics gr;  
  6. public void UI(){  
  7.     this.setTitle("服务器");  
  8.     this.setSize(400,400);  
  9.     this.setLocation(400,200);  
  10.     this.setLayout(new FlowLayout(FlowLayout.LEFT));  
  11.     this.setDefaultCloseOperation(3);  
  12.     JButton jb1=new JButton("start");//启动服务器按钮  
  13.     this.add(jb1);  
  14.     JTextField jt1=new JTextField();//输入消息框  
  15.     jt1.setPreferredSize(new Dimension(40,30));  
  16.     this.add(jt1);  
  17.     JButton jb2=new JButton("send");//发送按钮  
  18.     this.add(jb2);  
  19.      jt2=new JTextField();  
  20.     jt2.setPreferredSize(new Dimension(180,30));  
  21.     this.add(jt2);  
  22.      jt3=new JTextArea();  
  23.     jt3.setPreferredSize(new Dimension(400,150));  
  24.     this.add(jt3);  
  25.     JPanel jp=new JPanel();  
  26.     jp.setPreferredSize(new Dimension(400,150));  
  27.     this.add(jp);  
  28.     this.setVisible(true);  
  29.     gr= jp.getGraphics();  
  30.     Test t=new Test();  
  31.     fhj fh=new fhj(this,t);  
  32.     jp.addMouseListener(fh);  
  33.     fujian f=new fujian(jt1,jt2,t);  
  34.     jb1.addActionListener(f);  
  35.     jb2.addActionListener(f);  
  36. }  
  37. public static void setjt3(String s){  
  38.     jt3.setText(s);  
  39. }  
  40.     public static void main(String[] args) {  
  41.         // TODO Auto-generated method stub  
  42.        fu f=new fu();  
  43.        f.UI();  
  44.     }  
  45.   
  46. }  

 按下start触发事件fujian中的“start”

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.awt.event.ActionEvent;  
  4. import java.awt.event.ActionListener;  
  5.   
  6. import javax.swing.JTextField;  
  7.   
  8. public class fujian  implements ActionListener {  
  9.     public JTextField jt1,jt2;  
  10.     public Test tt;   
  11.     public fujian( JTextField jt1,JTextField jt2,Test tt ){  
  12.         this.jt1=jt1;  
  13.         this.jt2=jt2;  
  14.         this.tt=tt;  
  15.     }  
  16.     int co=0;  
  17.     @Override  
  18.     public void actionPerformed(ActionEvent e) {  
  19.       
  20.         // TODO Auto-generated method stub  
  21.         if(e.getActionCommand().equals("start")){  
  22.               
  23.             if(co==0){  
  24.             fuxian u=new fuxian(jt1,tt);  
  25.             u.start();  
  26.             co=1;  
  27.             }else{  
  28.                 System.out.println("端口已经成功创建无需再创建");  
  29.             }  
  30.         }  
  31.         if(e.getActionCommand().equals("send")){  
  32.             for(int i=0;i<tt.l.size();i++){  
  33.                 try {  
  34.                     tt.l.get(i).qunfa(jt2.getText());  
  35.                 } catch (Exception e1) {  
  36.                     // TODO Auto-generated catch block  
  37.                     e1.printStackTrace();  
  38.                 }  
  39.             }  
  40.         }  
  41.     }  
  42.   
  43. }  

 启动一个线程fuxian u=new fuxian(jt1,tt); u.start();来启动服务器

Java代码  收藏代码
  1. package First;  
  2.   
  3. import javax.swing.JTextField;  
  4.   
  5. public class fuxian extends Thread{  
  6.     public JTextField jt;  
  7.     public Test tt;   
  8. public fuxian(JTextField jt,Test tt){  
  9.     this.jt=jt;  
  10.     this.tt=tt;  
  11. }  
  12. public void run(){  
  13.     int x=Integer.parseInt(jt.getText());  
  14.     tt.set(x);  
  15. }  
  16. }  

 

启动服务器的具体方法是Test类中的set()方法

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.StringReader;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9. import java.util.ArrayList;  
  10.   
  11. import org.omg.CORBA_2_3.portable.OutputStream;  
  12.   
  13. public class  Test {  
  14. public  ArrayList<Tx> l=new ArrayList<Tx>();  
  15. public void  set(int x) {  
  16.     //建立绑定在指定端口傻瓜的服务器  
  17.     ServerSocket se;  
  18.     try {  
  19.         se = new ServerSocket(x);  
  20.         System.out.println("服务器创建成功"+x);  
  21.         Socket c;  
  22.         //让服务器进入等待状态:  
  23.         while(true){  
  24.         c=se.accept();  
  25.         Tx t=new Tx(c,this);  
  26.         l.add(t);  
  27.         System.out.println("目前队列的长度是"+l.size());  
  28.         t.start();  
  29.     }  
  30.     }catch (Exception e) {  
  31.         // TODO Auto-generated catch block  
  32.         e.printStackTrace();  
  33.     }  
  34.   
  35.     }  
  36.     /** 
  37.      * @param args 
  38.      */  
  39.     public static void main(String[] args) {  
  40.           
  41.     }  
  42.   
  43. }  

 其中public  ArrayList<Tx> l=new ArrayList<Tx>();是一个Tx类型的队列,用来存储Tx对象

c=se.accept();
Tx t=new Tx(c,this);
l.add(t);
一旦有客户连接就启动Tx线程,并且将Tx对象存储,现在来看下Tx的具体类容

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.DataInputStream;  
  5. import java.io.DataOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.InputStreamReader;  
  9. import java.net.Socket;  
  10. import java.util.ArrayList;  
  11.   
  12. public class Tx extends Thread {  
  13.     public DataInputStream Di;  
  14.     public DataOutputStream Do;  
  15.     public BufferedReader bf;  
  16.     public int j=0;  
  17.     public Socket c;  
  18.     public String name="",r;  
  19.     public java.io.OutputStream out;  
  20.     public Test t1;  
  21.     public InputStream in;  
  22.     public Tx(Socket c,Test t1) throws Exception {  
  23.         this.c=c;  
  24.         this.t1=t1;  
  25.          in=c.getInputStream();  
  26.          Di=new DataInputStream(in);  
  27.         out=c.getOutputStream();  
  28.         Do=new DataOutputStream(out);  
  29.     }  
  30.     public void qunfa(String s) throws Exception{     
  31.       s +="\r\n";  
  32.     byte[] data=s.getBytes();  
  33.     String t=new String(data);  
  34.     System.out.println(t);  
  35.     Do.writeByte(1);  
  36.     Do.write(data);  
  37.     }  
  38. public  void jieshou() throws Exception{  
  39.        //out=c.getOutputStream();  
  40.        int k=Di.readByte();  
  41.   if(k==0){  
  42.            int x1=Di.readInt();  
  43.            int y1=Di.readInt();  
  44.            int x2=Di.readInt();  
  45.            int y2=Di.readInt();  
  46.            System.out.println("接受成功");  
  47.            fu.gr.drawLine(x1, y1, x2, y2);  
  48.            for(int i=0;i<t1.l.size();i++){  
  49.             t1.l.get(i).Do.writeByte(0);  
  50.             t1.l.get(i).Do.writeInt(x1);  
  51.             t1.l.get(i).Do.writeInt(y1);  
  52.             t1.l.get(i).Do.writeInt(x2);  
  53.             t1.l.get(i).Do.writeInt(y2);  
  54.             //t1.l.get(i).Do.flush();  
  55.             System.out.println("传送成功");  
  56.             }  
  57.   }else if(k==1){  
  58.        System.out.println("正在接受文字");  
  59.        bf=new BufferedReader(new InputStreamReader(in));  
  60.        r=bf.readLine();  
  61.         System.out.println(r);  
  62.         System.out.println("阅读完毕");  
  63.         fu.setjt3(r);  
  64.         String g="user"+r;  
  65.         g+="\r\n";  
  66.         byte[] e=g.getBytes();  
  67.         for(int i=0;i<t1.l.size();i++){  
  68.             t1.l.get(i).Do.writeByte(1);  
  69.             t1.l.get(i).Do.write(e);  
  70.             //t1.l.get(i).out.flush();  
  71.             System.out.println("执行了-----------"+i);  
  72.         System.out.println(r+"文字接受成功");  
  73.     }  
  74.         }else{  
  75.             System.out.println("eeeeeeeeeeeeeeeeeeeee"+k);  
  76.         }  
  77.        }  
  78. public void X() throws Exception{  
  79.     while(true){  
  80.         System.out.println("主机接收");  
  81.         jieshou();  
  82.         }  
  83. }  
  84. public void run(){  
  85.     try {  
  86.         X();  
  87.     } catch (Exception e) {  
  88.         // TODO Auto-generated catch block  
  89.         e.printStackTrace();  
  90.     }  
  91. }  
  92. }  

 由

public void run(){
try {
X();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
看出是线程开启 X();x()里面是个死循环 一直执行jieshou()方法

接收分为两种一种是接收图象,一种接收文字(自己定义的协议)

客户端连接之后开启线程接收,为什么要存储起来呢

这样就能对每一个客户端进行管理了,你可以向某一个客户端发送,或者全部发送(里面的qunfa方法)

上面是服务器接收,现在看服务器发送,这是fujian里面的方法,按下send之后,获取输入框上的东东,调用qunfa发送,其中有一个循环,就是把所有连接进来的客户端Tx对像取出来调用发送方法qunffa()

Java代码  收藏代码
  1. if(e.getActionCommand().equals("send")){  
  2.         for(int i=0;i<tt.l.size();i++){  
  3.             try {  
  4.                 tt.l.get(i).qunfa(jt2.getText());  
  5.             } catch (Exception e1) {  
  6.                 // TODO Auto-generated catch block  
  7.                 e1.printStackTrace();  
  8.             }  
  9.         }  

 然后就是可以看下如何传送图像

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.awt.event.MouseAdapter;  
  4. import java.awt.event.MouseEvent;  
  5. import java.io.DataInputStream;  
  6. import java.io.DataOutputStream;  
  7. import java.io.IOException;  
  8.   
  9. public class fhj extends MouseAdapter{  
  10.     public Test tt;  
  11.     public fu f;  
  12.     public int  x1,x2,y1,y2;  
  13.     public fhj(fu f,Test tt){  
  14.         this.f=f;  
  15.         this.tt=tt;  
  16.     }  
  17.     public void mousePressed(MouseEvent e){  
  18.         x1=e.getX();  
  19.         y1=e.getY();  
  20.           
  21.     }  
  22.     public void  mouseReleased(MouseEvent e){  
  23.         x2=e.getX();  
  24.         y2=e.getY();  
  25.         f.gr.drawLine(x1,y1,x2,y2);  
  26.         for(int i=0;i<tt.l.size();i++){  
  27.         try {  
  28. //          tt.l.get(i).Do.writeByte(1);  
  29. //          String s="画线成功";  
  30. //          s=s+"\r\n";  
  31. //          byte[] b=s.getBytes();  
  32.             //tt.l.get(i).Do.write(b);  
  33.             tt.l.get(i).Do.writeByte(0);  
  34.             tt.l.get(i).Do.writeInt(x1);  
  35.             tt.l.get(i).Do.writeInt(y1);  
  36.             tt.l.get(i).Do.writeInt(x2);  
  37.             tt.l.get(i).Do.writeInt(y2);  
  38.             System.out.println("发送成功-------------"+tt.l.size());  
  39.           
  40.         } catch (Exception e1) {  
  41.             // TODO Auto-generated catch block  
  42.             e1.printStackTrace();  
  43.         }}  
  44.           
  45. }  
  46.     }  

 

上面是对画板的监听,首先传入tt.l.get(i).Do.writeByte(0);0,(自己定义的格式,接收方如果首先接收到0,就执行接收图片的方法),然后就是传入线条的四个坐标,(关于鼠标监听,前面的博客java基础画图板有说过),这样服务器这边就写完了

/******************************************下面开始客户端的接收与发送*********************************/

客户端和服务器的接收和发送差不多,所以不再啰嗦

界面

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.awt.Dimension;  
  4. import java.awt.FlowLayout;  
  5. import java.awt.Graphics;  
  6.   
  7. import javax.swing.JButton;  
  8. import javax.swing.JFrame;  
  9. import javax.swing.JPanel;  
  10. import javax.swing.JTextArea;  
  11. public class ku extends JFrame{  
  12.     static String s;  
  13.     static Graphics g;  
  14.     static JTextArea jt1;  
  15.     static JTextArea jt2;  
  16.     public void UI(){  
  17.         this.setTitle("客户端");  
  18.         this.setSize(400,400);  
  19.         this.setLocation(400,200);  
  20.         this.setLayout(new FlowLayout(FlowLayout.CENTER));  
  21.         this.setDefaultCloseOperation(3);  
  22.         JButton jb1=new JButton("登录");  
  23.         JButton jb2=new JButton("发送");  
  24.          jt1=new JTextArea();  
  25.         jt1.setPreferredSize(new Dimension(380,100));  
  26.         jt2=new JTextArea();  
  27.         jt2.setPreferredSize(new Dimension(380,100));  
  28.         JPanel jp=new JPanel();  
  29.         this.add(jp);  
  30.         jp.setPreferredSize(new Dimension(380,100));  
  31.         this.add(jt1);  
  32.         this.add(jt2);  
  33.         this.add(jb1);  
  34.         this.add(jb2);  
  35.         this.setVisible(true);  
  36.         g=jp.getGraphics();  
  37.         kejian ke=new kejian();  
  38.         kbj kb=new kbj(this,ke);  
  39.         jp.addMouseListener(kb);  
  40.         jb1.addActionListener(ke);  
  41.         jb2.addActionListener(ke);  
  42.     }  
  43.     public  static void getjt2(){  
  44.          s=jt2.getText();  
  45.     }  
  46.     public static void setjt2(){  
  47.         jt2.setText("");  
  48.     }   
  49. public static void setjt1(){  
  50.     jt1.setText(s);  
  51. }  
  52. public static void setjt1(String st){  
  53.     jt1.setText(st);  
  54. }  
  55.     /** 
  56.      * @param args 
  57.      */  
  58.     public static void main(String[] args) {  
  59.         // TODO Auto-generated method stub  
  60. ku t=new ku();  
  61. t.UI();  
  62.     }  
  63. }  

 

然后是连接和接收的方法,

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedReader;  
  5. import java.io.DataInputStream;  
  6. import java.io.DataOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStream;  
  11. import java.net.Socket;  
  12. import java.net.UnknownHostException;  
  13.   
  14. public class kehu extends Thread{  
  15.     public int j=2;  
  16. public int i=0;  
  17. public BufferedReader bu;  
  18. public String ip;  
  19. public int pot;  
  20. public StringBuffer b=new StringBuffer() ;  
  21. public  InputStream in;  
  22. static  OutputStream out;  
  23. static DataInputStream Di;  
  24. static DataOutputStream Do;  
  25. //public kehu(String ip,int pot){this.ip=ip;this.pot=pot;}  
  26. public void login() throws Exception{  
  27.     Socket s=new Socket( "172.16.27.47"9090);  
  28.     in=s.getInputStream();  
  29.     out=s.getOutputStream();  
  30.     Di=new DataInputStream(in);  
  31.     Do=new DataOutputStream(out);  
  32.     while(true){  
  33.         System.out.println("等待循环");  
  34.         js();  
  35.     }  
  36. }  
  37. public void js() throws Exception{  
  38.     System.out.print("客户端正在接受");  
  39.     int k=Di.readByte();  
  40.     if(k==0){  
  41.         int x1=Di.readInt();  
  42.         int y1=Di.readInt();  
  43.         int x2=Di.readInt();  
  44.         int y2=Di.readInt();  
  45.         ku.g.drawLine(x1, y1, x2, y2);  
  46.     }else if(k==1){  
  47.     bu=new BufferedReader(new InputStreamReader(in));  
  48.     String str=bu.readLine();  
  49.     ku.setjt1(str);  
  50.     System.out.println("设置窗体"+str);  
  51. }  
  52. }  
  53. public void run(){  
  54.     try {  
  55.         login();  
  56.     } catch (Exception e) {  
  57.         // TODO Auto-generated catch block  
  58.         e.printStackTrace();  
  59.     }  
  60. }  
  61. public static void main(String[] args) throws Exception{  
  62.     //new kehu().login("192.168.1.149", 9090);  
  63. }  
  64. }  

 这是放送的方法

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.awt.event.ActionEvent;  
  4. import java.awt.event.ActionListener;  
  5. import java.io.IOException;  
  6.   
  7. public class kejian implements ActionListener{  
  8.     public kehu k;  
  9.     public void actionPerformed(ActionEvent e) {  
  10.         // TODO Auto-generated method stub  
  11.         if(e.getActionCommand().equals("登录")){  
  12.             try {  
  13.                 k=new kehu();  
  14.                 k.start();  
  15.             } catch (Exception e1) {  
  16.                 // TODO Auto-generated catch block  
  17.                 e1.printStackTrace();  
  18.             }  
  19.         }  
  20.         if(e.getActionCommand().equals("发送")){  
  21.             ku.getjt2();  
  22.             ku.setjt2();  
  23.             String st=ku.s;  
  24.             st+="\r\n";  
  25.             System.out.println(st+"-------客户端发送成功-----------");  
  26.             byte[] by=st.getBytes();  
  27.             try {  
  28.                 k.Do.writeByte(1);  
  29.                 k.out.write(by);  
  30.             } catch (IOException e1) {  
  31.                 // TODO Auto-generated catch block  
  32.                 e1.printStackTrace();  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37. }  

 画板发送的方法

Java代码  收藏代码
  1. package First;  
  2.   
  3. import java.awt.event.MouseAdapter;  
  4. import java.awt.event.MouseEvent;  
  5. import java.io.DataInputStream;  
  6. import java.io.DataOutputStream;  
  7.   
  8. public class kbj extends MouseAdapter{  
  9.     public int i=0;  
  10.     public kejian ke;  
  11.     public ku kk;  
  12.     public int  x1,x2,y1,y2;  
  13.     public kbj(ku k,kejian ke2){  
  14.         this.ke=ke2;  
  15.         this.kk=k;  
  16.     }  
  17.       
  18.     public void mousePressed(MouseEvent e){  
  19.         x1=e.getX();  
  20.         y1=e.getY();  
  21.           
  22.     }  
  23.     public void  mouseReleased(MouseEvent e){  
  24.         x2=e.getX();  
  25.         y2=e.getY();  
  26.         try {  
  27.             ke.k.Do.writeByte(0);  
  28.             ke.k.Do.writeInt(x1);  
  29.             ke.k.Do.writeInt(y1);  
  30.             ke.k.Do.writeInt(x2);  
  31.             ke.k.Do.writeInt(y2);  
  32.             System.out.println("发送成功");  
  33.             ke.k.Do.flush();  
  34.         } catch (Exception e1) {  
  35.             // TODO Auto-generated catch block  
  36.             e1.printStackTrace();  
  37.         }  
  38.         kk.g.drawLine(x1, y1, x2, y2);  
  39.         }  
  40.           
  41. }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics