先上代码
服务器端Server:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class SeverFrame implements ActionListener{
ServerSocket server;
Socket s;
Frame mainFrame=new Frame("Sever"); //主框架
Panel p1=new Panel();
TextField tfPort=new TextField("5000",40); //端口号文本框
Button btnListen=new Button(" Listen "); //监听按钮
TextArea taMSG=new TextArea(6,50); //接收消息文本框
Panel p2=new Panel();
TextField tfSend=new TextField(50); //向客户端发送消息文本框
Button btnSend=new Button(" Send "); //发送按钮
public SeverFrame() { //无参构造函数
mainFrame.add(p1,"North");
btnListen.addActionListener(this);
p1.add(new Label("Port:"));p1.add(tfPort);p1.add(btnListen);
mainFrame.add(taMSG,"Center");
mainFrame.add(p2,"South");
btnSend.addActionListener(this);
p2.add(new Label("Server-Speak:"));p2.add(tfSend);p2.add(btnSend);
mainFrame.pack();
mainFrame.setVisible(true);
}
public static void main(String/[/] args) {
new SeverFrame();
}
class ServerRecvThread extends Thread{ //服务端接收客户端的线程
Socket s;
public ServerRecvThread(Socket s) {
this.s=s;
}
@Override
public void run() { //重写run方法
try {
InputStream is=s.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String hear=reader.readLine(); //读一行文本
while(!"bye".equals(hear)) {
taMSG.append("The client says:"+hear+"//n");
hear=reader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) { //实现事件监听
try {
//获得事件源对象
Object eventSource=e.getSource();
//按下监听按钮
if(eventSource==btnListen) {
int port=Integer.parseInt(tfPort.getText()); //string类型转换为int型
server=new ServerSocket(port);
taMSG.append("ServerSocket is listening on "+port+"//n");
s=server.accept(); //ServerSocket开始监听
taMSG.append("A client is connected!//n");
Thread t=new ServerRecvThread(s);
t.start(); //sever线程开始
}else if(eventSource==btnSend) { //按下发送按钮,向客户端发送消息
String send=tfSend.getText();
if(send.equals(""))return;
OutputStream os=s.getOutputStream();
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(os));
writer.write(send);writer.newLine();
writer.flush();
}
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
客户端Client:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class ClientFrame implements ActionListener{
Socket s;
Frame mainFrame=new Frame("Client"); //主框架
Panel p1=new Panel();
TextField tfIP=new TextField("127.0.0.1",15); //IP地址文本框
TextField tfPort=new TextField("5000",15); //端口号文本框
Button btnConnect=new Button(" Connect "); //连接服务器按钮
TextArea taMSG=new TextArea(6,50); //接收消息文本框
Panel p2=new Panel();
TextField tfSend=new TextField(50); //发送消息文本框
Button btnSend=new Button(" Send "); //发送消息按钮
public ClientFrame() { //无参构造函数
mainFrame.add(p1,"North");
btnConnect.addActionListener(this);
p1.add(new Label("服务器IP:"));p1.add(tfIP);
p1.add(new Label("Port:"));p1.add(tfPort);p1.add(btnConnect);
mainFrame.add(taMSG,"Center");
mainFrame.add(p2,"South");
btnSend.addActionListener(this);
p2.add(new Label("Client-Speak:"));p2.add(tfSend);p2.add(btnSend);
mainFrame.pack();
mainFrame.setVisible(true);
}
public static void main(String/[/] args) {
new ClientFrame();
}
class ClientRecvThread extends Thread{ //实现客户端接收服务器的线程
Socket s;
public ClientRecvThread(Socket s) {
this.s=s;
}
@Override
public void run() { //重写run方法
try {
InputStream is=s.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String hear=reader.readLine();
while(!"bye".equals(hear)) {
taMSG.append("The server says:"+hear+"//n");
hear=reader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) { //实现事件监听
try {
//获得事件源对象
Object eventSource=e.getSource();
if(eventSource==btnConnect) { //按下连接按钮,连接服务器
String ip=tfIP.getText();
String port=tfPort.getText();
s=new Socket(ip,Integer.parseInt(port));
taMSG.append("A server is connected!//n");
Thread t=new ClientRecvThread(s);
t.start(); //开始client线程
}else if(eventSource==btnSend) { //按下发送按钮,向服务器发送消息
String send=tfSend.getText();
if(send.equals(""))return;
OutputStream os=s.getOutputStream();
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(os));
writer.write(send);writer.newLine();
writer.flush();
}
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
(一)Socket编程
1、套接字概述:
网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序)。端口号规定为一个16位的0~65535之间的整数,其中0~1023被预先定义的服务通信占用。
2、两个主要的类(Socket,ServerSocket):
Socket:Socket是“IP地址 + 端口号”,组合成一个Socket对象,即客户端。ServerSocket:作用是创建一个监听服务(电话接线员),即服务器端。
理解:客户(Socket)想要去邮局办理特快邮寄业务,已知办理此业务在8号窗口。到达8号窗口后,一位业务员(ServerSocket)正在等待客户办理业务。
Socket s = new Socket(“127.0.0.1”,5000);//一个客户 ServerSocket server = new ServerSocket(5000);//一个业务员 Socket sc = server.accept();//服务开始
ServerSocket对象调用accept()方法会返回一个和客户端Socket对象相连接的Socket对象sc。sc调用getOutputStream()获得一个输出流指向客户端的输入流(向客户端发消息),sc调用getInputStream()获得一个输入流指向客户端的输出流(收客户端的消息)。
ps.accept()方法会阻塞线程,直到收到客户的呼叫。