这几天有空,写几个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(10, 30);
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(400, 300);
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(15, 32);
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, 0, false),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