`
jsamson
  • 浏览: 117008 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Socket例子,仅引用

阅读更多
服务器端的源代码是:
/*
*
* @(#)Chat_Server.java
*
*
* @author
* @version 1.00 2009/4/2
*/

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;


public class Chat_Server extends JPanel
{

private JPanel topPanel = new JPanel();
private JPanel buttonPanel = new JPanel();
private DefaultTableModel defaultModel;
private JTable nameTable;
private JButton exitButton;
private JList list;
private DefaultListModel listModel;
private JButton sendButton = new JButton("发送(S)");

private JTextField sayWord =new JTextField();

private Vector totalThread = new Vector();      //totalThread将所有连接保存在其中,当需要时从中取出
private int port = 8082;

    public Chat_Server()
    {
        this.setLayout(new GridLayout(2,1));
    }

    public void init()
    {
        String[]columName = new String[] {"用户名称","IP"
        };

        String[][] tempData = new String[][] {{"",""
    }};

defaultModel = new DefaultTableModel(tempData,columName);     //这一段....
nameTable =new JTable(defaultModel);
nameTable.setRowHeight(22);

exitButton =new JButton("关闭服务器(C)");
exitButton.addActionListener(new ActionListener(){          //
    public void actionPerformed(ActionEvent e){
        System.exit(0);
    }
});

topPanel.setLayout(new BorderLayout());
topPanel.add(new JLabel("在线用户",JLabel.LEFT),BorderLayout.NORTH);
topPanel.add(new JScrollPane(nameTable),BorderLayout.CENTER);

listModel = new DefaultListModel();
list = new JList(listModel);

JPanel temp =new JPanel(new BorderLayout());
temp.add(sayWord,BorderLayout.CENTER);
sendButton.addActionListener(new ActionListener(){         //按发送键 发送信息
    public void actionPerformed(ActionEvent arg0){
        sendData();
    }
});

sendButton.setMnemonic('s');                      //设置快捷键 ALT + S 发送  sendButton
//sendButton.setMnemonic(java.awt.event.KeyEvent.VK_ENTER);   //设置快捷键 CTRL + ENTER 发送  sendButton  不行
temp.add(sendButton,BorderLayout.EAST);
JPanel temp2 = new JPanel();
exitButton.setMnemonic('c');                //设置快捷键 ALT + C 关闭服务器 exitButton
temp2.add(exitButton);
temp.add(temp2,BorderLayout.SOUTH);

buttonPanel.setLayout(new BorderLayout());
buttonPanel.add(new JScrollPane(list),BorderLayout.CENTER);
buttonPanel.add(temp,BorderLayout.SOUTH);

this.add(topPanel);
this.add(buttonPanel);
new StartServer().start();
new UpdateThread().start();       //两进程

    }
class StartServer extends Thread
{
    public void run()
    {
        try
        {
            ServerSocket serverSocket = new ServerSocket(port);
            while(true)
            {
                try
                {
                    Socket s  = serverSocket.accept();
                    AcceptThread acceptThread = new AcceptThread(s);
                    acceptThread.start();
                    totalThread.add(acceptThread);
                }catch(IOException ex2)
                {
                    throw ex2;
                }
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

private void addWord(String word)
{
    listModel.add(0,word);
}

private void sendData()       //sendData()用于将服务器发言发送给每一个客户端,具体发送由sendWordToEveryone完成
{
    String temp = "xinye说: "+sayWord.getText().trim();
    sendWordToEveryone(temp.getBytes());
    addWord(temp);
    sayWord.setText(""); //.....................................................重新设置为空.
}

class UpdateThread extends Thread
{
    public void run()
    {
        while(true)
        {
            String[] columName = new String[]{
                "用户名称","IP"
            };

            String[][] tempData = new String[][] {

            };

            defaultModel = new DefaultTableModel(tempData,columName);
            AcceptThread tempThread = null;
            Object tempObject = null;                              //这是什么 tempObject ?
            Enumeration enum1 = totalThread.elements();            //
            while(enum1.hasMoreElements())
            {
                tempObject = enum1.nextElement();
                if(tempObject !=null)
                {
                    tempThread = (AcceptThread)tempObject;
                    if(tempThread.isAlive())
                        defaultModel.addRow(new String[]{
                            tempThread.getUserName(),
                            tempThread.getUserIP()
                        });
                        else
                            tempObject= null;
                }

                nameTable.setModel(defaultModel);//创建了新的DefaultTableModel ,调用JTable的setModel方法后,JTable将显示
                                                 //这个DefaultTableModel的内容
            }

            try
            {
                sleep(6000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args)
{
    JFrame mf = new JFrame("服务端");
    Chat_Server server = new Chat_Server();
    mf.getContentPane().add(server);
    mf.setLocation(150,0);
    mf.setSize(300,400);
    mf.setDefaultCloseOperation(mf.EXIT_ON_CLOSE);
    server.init();                           //
    mf.setVisible(true);
}

class AcceptThread extends Thread  //serverSocket为每一个客户请求都会生成一个新的AcceptThread线程
{
    Socket s = null;
    InputStream inputStream = null;
    OutputStream outputStream = null;
    String name= "此处为昵称";
    String ip;
    boolean flag = true;
    BufferedInputStream bis;
    BufferedOutputStream bos;
    byte[] bytes;

    public AcceptThread(Socket s)
    {
        this.s = s;
        ip = s.getInetAddress().getHostAddress();    //要获取客户端地址,这里应该写错了
        System.out.println(ip);

        try
        {
            inputStream = s.getInputStream();
            outputStream = s.getOutputStream();
            bos = new BufferedOutputStream(outputStream,1024);
        }catch(IOException e)
        {
            e.printStackTrace();
            if(s!=null)
            {
                try{
                    s.close();

                }catch(IOException e1){
                    e1.printStackTrace();
                }
            }
            flag = false;
        }
    }

    public void run()
    {
        bis = new BufferedInputStream(inputStream,1024);
        while(flag)
        {
            try
            {
                bytes = new byte[1024];
                bis.read(bytes);
                String tempS= new String(bytes);
                tempS = tempS.trim();
                name = tempS.substring(0,tempS.indexOf("说"));           //subString or substring
                addWord(tempS);                                          //查 addWord
                sendWordToEveryone(bytes);
            }catch(IOException e)
            {
                e.printStackTrace();
                flag = false;
            }
        }
    }

    public void sendWord(byte[] bytes)          //AcceptThread用sendWord来向和自己建立专线连接的客户发送数据
    {
        try
        {
            bos.write(bytes);
            bos.flush();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public String getUserName()         //用于返回当前客户端的名称
    {
        return name;
    }

    public String getUserIP()
    {
        return ip;
    }
}

private void sendWordToEveryone(byte[] bytes)    //sendwordToEveryone从totalThread中提取每一个AcceptThead并向活动的线程发送数据
{
Enumeration enum1 = totalThread.elements();
while(enum1.hasMoreElements())
{
    Object tempObject = enum1.nextElement();
    if(tempObject != null)
    {
        AcceptThread tempThread = (AcceptThread)tempObject;
        if(tempThread.isAlive())
        {
            tempThread.sendWord(bytes);
        }
    }
}
}
}


客户端的代码是:
/**
* @(#)Chat_Client.java
*
*
* @author
* @version 1.00 2009/4/1
*/

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; 
import java.awt.*;
import java.awt.event.*;               
                                 //以上界面相关

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;     //以上通信相关

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import java.lang.InterruptedException;        //
public class Chat_Client extends JPanel{

private InputStream inputStream;
private OutputStream outputStream;
private JTextField sayText = new JTextField();
private Socket s;                            
private DefaultListModel listModel = new DefaultListModel();       //DefaultListModel vs JList
private JList list = new JList(listModel);
private JTextField nameText = new JTextField(10);
private BufferedOutputStream bos;
private JButton sendButton = new JButton("发送(S)");

private String host ="";
private JTextField  hostIP = new JTextField(15);
private int port = 8082;

public void init()
{
    nameText.setText("此处昵称");
    setLayout(new BorderLayout());
    add(this.getContextPane(),BorderLayout.CENTER);
    add(this.getButtonPanel(),BorderLayout.SOUTH);   


    //this.startClient(host,port);
}

public static void main(String[] args)
{
    JFrame frame = new JFrame("客户端");
    frame.setSize(300,400);
    frame.setLocation(150,100);
    Chat_Client chatClient = new Chat_Client();
    chatClient.init();
    frame.getContentPane().add(chatClient);

    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

private boolean flag = true;

//startClient与服务器建立连接并获取输入输出流
private void startClient(String host,int port)
{
    try
    {  
        host = hostIP.getText();
        s  = new Socket(InetAddress.getByName(host),port);
        inputStream = s.getInputStream();
        outputStream = s.getOutputStream();
        bos = new BufferedOutputStream(outputStream,1024);
        System.out.println(bos);
        new ResevWord(inputStream).start();
    }catch(UnknownHostException e)
    {
        e.printStackTrace();

    }catch(IOException e)
    {
        e.printStackTrace();
            flag = false;
    }
}

//sendData将数据发往服务器
private void sendData()
{
    String word = nameText.getText()+"说: "+sayText.getText();
    try
    {
        bos.write(word.getBytes());
        bos.flush();
    }catch(IOException e)
    {
        e.printStackTrace();
    }
    sayText.setText("");        //重新设为空
}


class ResevWord extends Thread           //ReseWord可用于创建新的线程,用于接收数据
{
InputStream ips = null;
BufferedInputStream bis =null;
byte[] bytes = new byte[1024];
public ResevWord(InputStream ips)
{
    this.ips = ips;
    bis = new BufferedInputStream(ips,1024);
}

public void run()
{
    while(flag)                                       //循环,多个客户端?
    {
        try{

            try{
                bis.read(bytes);
                String word =new String(bytes);
                word = word.trim();
                listModel.add(0,word);      //在此列表的指定位置处插入指定元素
            }catch(IOException ex){
                ex.printStackTrace();
                flag = false;
            }
        }catch(Exception ee){
            ee.printStackTrace();
        }
    }
}
}

private JPanel getContextPane()
{
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    JPanel p1 = new JPanel();
    p1.setLayout(new BorderLayout());

    JPanel p11 = new JPanel();
    //p11.setLayout(new BorderLayout());
    JLabel j1 = new JLabel("我是");
    p11.add(j1);
    p11.add(nameText);

    JPanel p12 = new JPanel();
    JLabel j2 = new JLabel("服务器IP");
    p12.add(j2);
    p12.add(hostIP);
   
    JPanel p13 = new JPanel();
    JButton connectServer = new JButton("连接服务器");
   connectServer.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            startClient(host,8082);
        }
    });
   
     p13.add(connectServer);
  
    p1.add(p11,BorderLayout.NORTH);
    p1.add(p12,BorderLayout.CENTER);
    p1.add(p13,BorderLayout.SOUTH);
      
        panel.add(p1,BorderLayout.NORTH);
    panel.add(new JScrollPane(list),BorderLayout.CENTER);           //有个list
    return panel;
}

private JPanel getButtonPanel()
{
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(sayText,BorderLayout.CENTER);
    sendButton.setMnemonic('s');                        //快捷键  ALT + S  sendButton 发送
     sendButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            sendData();
        }
    });
    panel.add(sendButton,BorderLayout.EAST);
    return panel;
}

}

本文代码来自:http://topic.csdn.net/u/20090404/01/2f349eb7-26b5-49ae-8955-78cc74bfd545.html
分享到:
评论

相关推荐

    Mina2.0.0_RC1 例子

    本例子是MyEclipse的JAVA工程,使用encoder和decoder对传输的数据对象编解码,接收和返回的数据头四个字节都表示后面数据的长度,源码中包含详细注释,理解后可修改为传输任意对象。 src源码包下的test.mina.server...

    Delphi7编译的程序在Win7下请求管理员权限示例

    演示如何让Delphi7编译的程序在Win7下请求管理员...如果把例子代码里的{$R uac.res}这行去掉再编译本程序,在Win7下使用ping就会出现 Cannot allocate socket的错误,因为TIdIcmpClient不是使用icmp.dll实现ping的。

    C#连接FreeSwitch执行一些操作操作例子

    C#环境下连接,操作FreeSwitch的例子,完全开源 如有改进意见请邮件或QQ联系: Email:hotzenplotz@163.com QQ:1969630628

    Fleck:C#Websocket实现

    从项目分支出来的Fleck不需要继承,容器或其他引用。 Fleck不依赖于HttpListener或HTTP.sys ,这意味着它将在Windows 7和Server 2008主机上运行。 例子 以下是将回显到客户端的示例。 var server = new ...

    MFC教程入门知识全集.rar

    1.4 this 指针的引用 1.5 类的继承与protected 访问修饰符 1.5.1 单一继承 (例子代码EX01-03) (图x,没有) 1.5.2 多重继承 1.6 虚函数与多态性 1.7 类的书写规范 1.8 小结 第2 章 Windows 程序内部运行...

    Golang Sample.zip

    实用Golang语言写的例子,包含如下: 0随机数的使用.go 10_1设备文件的使用.go 10_2文件的读写.go 10_3拷贝文件.go 1冒泡排序.go 1冒泡排序_切片做函数参数.go 2猜数字游戏.go 3_1结构体初始化.go 3_2结构体...

    (C#)vs2008 + wince程序(PDA) + SQLite

    给新人开发PDA的wince程序使用SQLite 的一个例子! 很多情况下PDA的wince程序是使用 webserver或者socket 来链接(通讯)服务段数据库,但在PDA的实际开发运用中 某些情况下根本不需要频繁与服务段交互; 因此可以使用...

    JAVA上百实例源码以及开源项目源代码

    Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...

    TCL编程初步

    TCL(Tool Command Language) 本书籍由浅入深系统地介绍了Tcl语言,是学习Tcl语言的良师益友 Tcl编程初步 总目录 总目录 I 例索引....例 4-8 string compare 和 string equal进行字符串比较的例子. 16

    JAVA上百实例源码以及开源项目源代码 java开源包2

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    TCPIP详解--共三卷

    3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的分组格式 40 4.5 ARP举例 41...

    TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议

    17.12 socketpair系统调用 17.13 pipe系统调用 17.14 PRU_ACCEPT请求 17.15 PRU_DISCONNECT请求和unp_disconnect函数 17.16 PRU_SHUTDOWN请求和unp_shutdown函数 17.17 PRU_ABORT请求和unp_drop函数 17.18 其他各种...

    COM组件间调用的性能问题

    也主动放弃了多线程特性(部分底层,socket等会有多线程),至少模块间调用是不会有多线程的,另外QQ是基于COM的组件编程,所有模块都是COM封装,有复杂的COM调用和引用计数问题,另外QQ的所有默认逻辑都是基于同步...

    合奏:一个实验性的集体设计的多人在线游戏

    该文件通常引用Client对象,该对象在client.js定义,并充当游戏和服务器之间的接口(如果您提供帮助,请将所有涉及Socket.io的交互都放在client.js )。 对于服务器,主要逻辑位于gameserver.js 。 随着代码库的...

    java源码包---java 源码 大量 实例

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    iPhone应用开发从入门到精通代码

    C的内存管理614.6.1 引用计数值614.6.2 对象释放池634.7 Objective-C的继承644.7.1 继承的语法654.7.2 继承的用法664.8 Objective-C的多态性、动态类型和动态绑定674.8.1 多态性674.8.2 动态绑定和动态类型...

    java源码包2

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    java源码包3

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    java源码包4

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

Global site tag (gtag.js) - Google Analytics