最简单的Socket入门示例--swing版

这几天有空,写几个socket的入门示例,都实现了 一台server应答多台client,不过在高手看来还是简单得不堪入目,但给刚接触java的socket编程的朋友还是有一定的帮助,首先载个图如下:....(郁闷中了)哎,不能上传图片了,直接发代码上来,有兴趣的朋友自己改好包名就可以运行了

服务端只有一组菜单,和一个显示信息的面板,每当有一个客户端来连接,都会显示连接客户机的ip和端口,采用多线程来应答多个客户机,提出几个需要完善的地方

1.服务端可以随意退出,这样客户端继续发送数据时就会收到一个异常,虽然我捕获了这个异常并提醒,但应该在服务端退出时,发出广播,通知客户端关闭socket

2.在File菜单可以增加一个保存连接信息的功能,把它保存在存储设备上

3.增加广播功能。

4.实现国际化,适应不同语言。

这些功能有待感兴趣的朋友们自己完善,如果有了好的实现版本,欢迎与我交流!可以加入群39340449交流

 

/**
 * project:study
 * package:netstudy.socket
 * file:MessageServer.java
 * date:2007-3-27
 
*/

package netstudy.socket;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * description:
 * 
 * 
 * Copyright(c) SunWay Technology Co.,Ltd
 * 
@author gavin --张逸轩
 * @date 2007-3-27
 
*/

public class MessageServer extends JFrame {

    
private JTextArea output;
    
private final int port = 10000;
    
public MessageServer(String title) {
        
super(title);
        init();
    }

    
private void init(){
        output 
= new JTextArea(1030);
        output.setEditable(
false);

        output.setForeground(Color.blue);
        JScrollPane jsp 
= new JScrollPane(output);
        JMenuBar menuBar 
= new JMenuBar();
        
        JMenu fileMenu 
= new JMenu("File");
        fileMenu.setMnemonic(
'F');
        JMenuItem exitItem 
= new JMenuItem("Exit...");
        exitItem.setMnemonic(
'X');
        exitItem.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent event) {
                
                System.exit(
0);
            }

        }
);
        fileMenu.add(exitItem);
        
        JMenu editMenu 
= new JMenu("Edit");
        editMenu.setMnemonic(
'E');
        JMenuItem clearItem 
= new JMenuItem("Clear");
        clearItem.setMnemonic(
'C');
        clearItem.addActionListener(
new ActionListener(){
            
public void actionPerformed(ActionEvent event){
                output.setText(
"");
            }

        }
);
        editMenu.add(clearItem);
        
        JMenu helpMenu 
= new JMenu("Help");
        helpMenu.setMnemonic(
'H');
        JMenuItem aboutItem 
= new JMenuItem("About...");
        aboutItem.setMnemonic(
'A');
        aboutItem.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent event) {
                JOptionPane.showMessageDialog(MessageServer.
this,
                        
"紫枫凝潇烟Socket学习""About", JOptionPane.PLAIN_MESSAGE);
            }

        }
);
        helpMenu.add(aboutItem);

        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(helpMenu);
        setJMenuBar(menuBar);

        add(jsp, BorderLayout.CENTER);
        setSize(
400300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this.setResizable(false);
        setVisible(
true);
    }

    
    
private void service(){
        
try {
            ServerSocket server 
= new ServerSocket(port);
            
            
            
while (true{
                
final Socket socket = server.accept();
                System.out.println(
"Accepted from " + socket.getInetAddress()
                        
+ " with port:"+ socket.getPort());
                
                output.append(
"  Accepted from "
                        
+ socket.getInetAddress() +" ,port:"+ socket.getPort()+" ");
                
new Thread(new Runnable(){
                    
public void run(){
                        
try {
                            BufferedReader in 
= new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            
                            PrintWriter out 
= new PrintWriter(socket.getOutputStream(), true);
                            
                            
                            
while(true){
                                String line 
= in.readLine();
                                System.out.println(
"Incept message:" + line);
                                output.append(
"Incept message:" + line+" ");
                                output.setCaretPosition(output.getText().length());
                                out.println(
"your input is " + line);
                                out.flush();
                                
if (line.equals("end")){
                                    out.println(
"Good Bye!");
                                    
break;
                                }

                            }

                            in.close();
                            out.close();
                            socket.close();
                            System.out.println(
"close the connection");
                        }
 catch (IOException e) {
                            e.printStackTrace();
                        }

                    }

                }
).start();
            }


        }
catch(BindException e){
            System.out.println(
"端口已被战用!");
            JOptionPane.showMessageDialog(
null,"端口已被战用,请检查服务器是否启动或者查看是否其它程序战用了此端口,换一个端口重试!","端口被占用",JOptionPane.ERROR_MESSAGE);
            System.exit(
0);
        }
 catch (IOException e) {
            e.printStackTrace();
        }

        
        
    }

    
    
public static void main(String[] args) {
        MessageServer serverFrame 
= new MessageServer("Server");
        serverFrame.init();
        
        serverFrame.service();
    }


}


客户端也是一个JFrame组成,一个面板,一个文本框,和两个按扭

客户端考虑了很多因素,但代码不够优雅,有好多内部类,封装也不够好,有兴趣的朋友可以把它完善

以下是客户端代码

/**
 * project:study
 * package:netstudy.socket
 * file:ClientMessage.java
 * date:2007-3-27
 
*/

package netstudy.socket;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.net.SocketException;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

/**
 * description:
 * 
 * 
 * Copyright(c) SunWay Technology Co.,Ltd
 * 
@author gavin --张逸轩
 * @date 2007-3-27
 
*/

public class MessageClient extends JFrame {
    
private Socket socket;
    
private BufferedReader in;
    
private PrintWriter out;
    
protected String host = "127.0.0.1";
    
protected int port = 10000;
    
public JTextArea output;
    
protected JTextField input;
    
public JTextField content;
    
    
public MessageClient(String title){
        
super(title);
        init();
    }

    
    
public void init(){
        
        
try{
            
            socket 
= new Socket(host,port);
            
            output 
= new JTextArea(1532);
            output.setEditable(
false);

            output.setForeground(Color.black);
            JScrollPane jsp 
= new JScrollPane(output);
            add(jsp,BorderLayout.NORTH);
            JPanel inputPanel 
= new JPanel();
            content 
= new JTextField(10);
            
            JButton sendButton 
= new JButton("Send");
            
            
            
            
/**响应回车事件*/
            content.registerKeyboardAction(
new Listener(),KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0false),JComponent.WHEN_FOCUSED);
            
/**响应点击Send按扭事件*/
            sendButton.addMouseListener(
new Listener());
            
/**响应点击Exit按扭事件*/
            JButton exitButton 
= new JButton("Exit");
            exitButton.addMouseListener(
new ExitListener());
            
            inputPanel.add(content);
            inputPanel.add(sendButton);
            inputPanel.add(exitButton);
            add(inputPanel,BorderLayout.SOUTH);
            addWindowListener(
new WindowAdapter(){
                
public void windowClosing(WindowEvent event){
                    
new ExitListener().executeClick();
                    System.out.println(
"已关闭");
                }


            }
);
            setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            setSize(
400,340);
            output.append(
"已建立连接|使用端口:" + socket.getPort()+ "... ");
        }
catch(ConnectException connEx){
            
            JOptionPane.showMessageDialog(
this,
                    
"系统错误,没有找到[胭红凝香腮]这位MM! 请确认她是否在你心里!!!""提示", JOptionPane.PLAIN_MESSAGE);
            System.exit(
0);
        }
catch(Exception e){
            
            e.printStackTrace();
        }

    }

    
    
public static void main(String[] args){
        
new MessageClient("客户端").setVisible(true);
    }


    
    
class Listener extends MouseAdapter implements ActionListener{

        
public void actionPerformed(ActionEvent e) {
            executeClick();
            
        }

        
public void mouseClicked(MouseEvent event){
            executeClick();
        }

        
        
        
private void executeClick(){
            Thread temp 
= new Thread(new Runnable(){

                
public void run() {
                    
try {
                        
if(socket==null || socket.isClosed()){
                            
int reConnect = JOptionPane.showConfirmDialog(null,"连接已断开,是否重新建立连接?","确认",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE );
                            
if(reConnect == 0){
                                socket 
= new Socket("127.0.0.1",10000);
                            }

                            
else
                                
return;
                        }

                        out 
= new PrintWriter(socket.getOutputStream());
                    
                        String contentText 
= content.getText();
                        content.setText(
"");
                        content.requestFocus();
                        
if(contentText==null)
                            
return;
                        System.out.println(
"发送数据" + contentText);
                        output.append(
"发送数据" + contentText+" ");
                        out.println(contentText);
                        out.flush();
                        in 
= new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String getResult
=in.readLine();
                        
while(getResult!=null){
                            System.out.println(
"接收到数据 " + getResult);
                            output.append(
"接收到数据" + getResult+" ");
                                
break;
                        }

                        output.setCaretPosition(output.getText().length());
                        
if(contentText.equals("end")){
                            
                            in.close();
                            out.close();
                            socket.close();
                        }

                        
return;
                    }
 catch(ConnectException connEx){
                        System.out.println(
"未连接到服务器,请检查网络!");
                        JOptionPane.showMessageDialog(
null,"未连接到服务器,请检查网络!","未连接",JOptionPane.ERROR_MESSAGE);
                    }
catch (SocketException e){
                        System.out.println(
"没有服务器");
                        output.append(
"没有服务器 ");
                        JOptionPane.showMessageDialog(
null,"连接已断开,请检查服务器并重试!","连接已断开",JOptionPane.ERROR_MESSAGE);
                    }
catch (IOException e) {
                        e.printStackTrace();
                    }

                }

                
            }
);
            temp.start();
        }

        
    }

    
    
class ExitListener extends MouseAdapter{
        
public void mouseClicked(MouseEvent event){
            executeClick();
        }

        
private void executeClick(){
            Thread temp 
= new Thread(new Runnable() {

                
public void run() {
                    
try {
                        
if (socket != null && !socket.isClosed()) {
                            out 
= new PrintWriter(socket.getOutputStream(),
                                    
true);
                            out.println(
"end");
                            socket.close();
                        }

                    }
 catch (IOException e) {
                        e.printStackTrace();
                    }

                    System.exit(
0);

                }


            }
);
            temp.start();
        }

    }

}

 

 可惜是不能发图片了,自己运行看效果吧,有更好的建议或者想法欢迎与我联系,email:cleverfoxlvoing@gmail.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值