浏览 5362 次
锁定老帖子 主题:Java程序(聊天)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-13
最后修改:2010-05-13
import java.io.*; public class ServerClass{ public static void main(String args[]){ int i=0; try{ ServerSocket ss=new ServerSocket(2345);//为该服务器开设一个端口,该端口供客户机程序来访问。 System.out.println("服务器启动......"); while(true){ Socket sock=ss.accept();//sock对象接收客户机的连接请求,程序运行到这里将处于等待状态。 i++; System.out.println("接受连接请求"+i); PrintStream out=new PrintStream(sock.getOutputStream());//获得输出流 out.println("你好"); out.close(); sock.close(); } }catch(IOException e){ System.out.println(e); } } } import java.io.*; import java.net.*; public class AClient{ public static void main(String args[]){ try{ Socket sock=new Socket("127.0.0.1",2345);//根据具体的(正在用的机器的)IP和端口,创建一个Socket对象 BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));//获得输入流。 String s=in.readLine();//从输入流读入一行内容。 System.out.println(s);//打印出 in.close(); }catch(IOException e){} } } import java.io.*; import java.net.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; /** 用户界面ServerUI */ public class ServerUI extends JFrame{ JTextArea mainArea; JTextArea sendArea; JTextField indexArea; SvrCom server; public void setServer( SvrCom server ) { this.server = server; } public ServerUI() { super("服务器端"); Container contain = getContentPane(); contain.setLayout( new BorderLayout() ); mainArea = new JTextArea(); JScrollPane mainAreaP = new JScrollPane( mainArea ); JPanel panel = new JPanel(); panel.setLayout( new BorderLayout() ); sendArea = new JTextArea(3, 8); JButton sendBtn = new JButton("发送"); sendBtn.addActionListener( new ActionListener()//注册动作监听器 { public void actionPerformed(ActionEvent ae) { server.sendMsg(sendArea.getText());//把信息传递到客户端 mainArea.append( "【服务器】" + sendArea.getText() + "\n" );//把信息显示在服务器的聊天记录区域 sendArea.setText(""); } } ); JPanel tmpPanel = new JPanel(); indexArea = new JTextField(2); indexArea.setText("0"); tmpPanel.add( sendBtn ); tmpPanel.add( indexArea ); panel.add( tmpPanel, BorderLayout.EAST ); panel.add(sendArea, BorderLayout.CENTER ); contain.add( mainAreaP, BorderLayout.CENTER ); contain.add( panel, BorderLayout.SOUTH ); setSize( 500, 300); setVisible( true ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { ServerUI ui = new ServerUI(); SvrCom server = new SvrCom( ui );//创建并启动网络通讯线程,准备接受客户端数据包 } } /** 通讯类SvrCom负责守候数据到来 */ class SvrCom extends Thread//网络通讯类 { Socket client; ServerSocket soc; BufferedReader in; PrintWriter out; ServerUI ui; // ChatServer server; public SvrCom( ServerUI ui ){ //初始化SvrCom类 this.ui = ui; ui.setServer( this ); try { soc = new ServerSocket(6666 ); //开设服务器端口6666 System.out.println( "启动服务器成功,等待端口号:6666" ); client = soc.accept();//当客户机请求连接时,创建一条链接 System.out.println( "连接成功!来自" + client.toString() ); in = new BufferedReader( new InputStreamReader( client.getInputStream()) ); out = new PrintWriter( client.getOutputStream() , true); } catch( Exception ex ) { System.out.println( ex ); } start(); } public void run () {// 用于监听客户端发送来的信息 String msg = ""; while( true ) { try { msg = in.readLine();//从in对象上读数据信息 } catch( SocketException ex ) { System.out.println(ex); break; } catch( Exception ex ) { System.out.println(ex); } if( msg!=null && msg.trim()!="" ) { System.out.println(">>" + msg ); ui.mainArea.append( msg + "\n" ); } } } public void sendMsg( String msg ) {// 用于发送信息 try { out.println("【服务器】" + msg );//把信息写入输出流 } catch(Exception e) { System.out.println( e ); } } } import java.io.*; import java.net.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; /** 用户界面ClientUI */ public class ClientUI extends JFrame { JTextArea mainArea; JTextArea sendArea; ChatClient client; JTextField ipArea; JButton btnLink; public void setClient( ChatClient client ) { this.client = client; } public ClientUI() { super("客户端"); Container contain = getContentPane(); contain.setLayout( new BorderLayout() ); mainArea = new JTextArea(); JScrollPane mainAreaP = new JScrollPane( mainArea );//为文本区添加滚动条 JPanel panel = new JPanel(); panel.setLayout( new BorderLayout()); sendArea = new JTextArea(3, 8); JButton sendBtn = new JButton("发送"); sendBtn.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { client.sendMsg( sendArea.getText() ); mainArea.append( "【客户端】"+sendArea.getText() + "\n" ); sendArea.setText(""); } } ); JPanel ipPanel = new JPanel(); ipPanel.setLayout( new FlowLayout( FlowLayout.LEFT , 10, 10 ) ); ipPanel.add( new JLabel("服务器:") ); ipArea = new JTextField( 12 ) ; ipArea.setText( "127.0.0.1" ); ipPanel.add( ipArea ); btnLink = new JButton("连接"); ipPanel.add( btnLink ); btnLink.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { client = new ChatClient( ipArea.getText() , 6666, ClientUI.this );//创建socket对象 ClientUI.this.setClient( client ); } } ); panel.add( sendBtn, BorderLayout.EAST ); panel.add( sendArea, BorderLayout.CENTER ); contain.add( ipPanel, BorderLayout.NORTH ); contain.add( mainAreaP, BorderLayout.CENTER ); contain.add( panel, BorderLayout.SOUTH ); setSize( 500, 300); setVisible( true ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { ClientUI ui = new ClientUI(); } } /** 通讯类ChatClient负责守候数据到来 */ class ChatClient extends Thread { Socket sc;// 对象sc,用来处理与服务?鞯耐ㄐ? BufferedReader in;//声明输入流缓冲区,用于存储服务器发来的信息 PrintWriter out;//声明打印输出流,用于信息的发送 ClientUI ui; public ChatClient( String ip, int port, ClientUI ui ){//初始化ChatClient类 this.ui = ui; try{ sc = new Socket(ip , port); // 创建sc, 用服务器ip和端口作参数 System.out.println("已顺利联接到服务器。"); out = new PrintWriter( sc.getOutputStream(), true ); in = new BufferedReader( new InputStreamReader( sc.getInputStream() ) ); } catch(Exception e) { System.out.println( e ); } start(); } public void run () { // 用于监听服务器端发送来的信息 String msg = ""; while( true ) { try { msg = in.readLine();//从缓冲区读入一行字符存于msg } catch( SocketException ex ) { System.out.println(ex); break; } catch( Exception ex ) { System.out.println(ex); } if( msg!=null && msg.trim()!="" ) {//若msg信息不为空 System.out.println(">>" + msg ); ui.mainArea.append( msg + "\n" );//把msg信息添加到客户端的文本区域内 } } } public void sendMsg( String msg ) {// 用于发送信息 try { out.println("【客户端】" + msg ); } catch(Exception e) { System.out.println( e ); } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-13
老兄,把代码格式化行不?代码放到代码片段不是更好?
|
|
返回顶楼 | |
发表时间:2009-05-16
yuantong 写道 老兄,把代码格式化行不?代码放到代码片段不是更好? 呵呵,下次 我再贴的时间 注意 |
|
返回顶楼 | |
发表时间:2009-05-18
import java.io.*; public class ServerClass{ public static void main(String args[]){ int i=0; try{ ServerSocket ss=new ServerSocket(2345);//为该服务器开设一个端口,该端口供客户机程序来访问。 System.out.println("服务器启动......"); while(true){ Socket sock=ss.accept();//sock对象接收客户机的连接请求,程序运行到这里将处于等待状态。 i++; System.out.println("接受连接请求"+i); PrintStream out=new PrintStream(sock.getOutputStream());//获得输出流 out.println("你好"); out.close(); sock.close(); } }catch(IOException e){ System.out.println(e); } } } |
|
返回顶楼 | |
发表时间:2009-05-18
import java.io.*;
public class ServerClass{ public static void main(String args[]){ int i=0; try{ ServerSocket ss=new ServerSocket(2345);//为该服务器开设一个端口,该端口供客户机程序来访问。 System.out.println("服务器启动......"); while(true){ Socket sock=ss.accept();//sock对象接收客户机的连接请求,程序运行到这里将处于等待状态。 i++; System.out.println("接受连接请求"+i); PrintStream out=new PrintStream(sock.getOutputStream());//获得输出流 out.println("你好2"); out.close(); sock.close(); } }catch(IOException e){ System.out.println(e); } } } |
|
返回顶楼 | |