一、服务端:
使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用, 所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
1、主类:调用第一个线程类
public class TestMain {
JFrame jFrame;
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestMain().initView();
}
public void initView()
{
jFrame=new JFrame("连接服务器");
jFrame.setBounds(600, 100, 420, 600);
jFrame.setLayout(null);
JButton jButton=new JButton("连接服务器");
jButton.setBounds(100, 100, 200, 50);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
MyThread myThread=new MyThread();
myThread.start();
}
});
jFrame.add(jButton);
jFrame.setVisible(true);
}
}
2、第一个线程类MyThread:客户端连接和处理
public class MyThread extends Thread{
//1、创建成员变量
ServerSocket Ssocket;//服务器端
int port=9995;//端口号尽量大,程序网络通讯
//2、加构造方法,服务器启动
public MyThread() {
try {
Ssocket=new ServerSocket(port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//3、在服务器端创建客户端对象
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
//1、检查客户端连接
//.accept方法用于产生阻塞,直到接收到一个连接,并且返回一个客户端的socket对象实例
Socket socket=Ssocket.accept();
//2、处理客户端Socket信息
MyThread_xinxi myThread_xinxi=new MyThread_xinxi(socket);
myThread_xinxi.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3、第二个线程类:处理信息
/*
* 功能:处理信息。getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
*/
public class MyThread_xinxi extends Thread{
Socket socket;//建立网络连接时使用,在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话
BufferedReader in;//接收消息
/*
* 方法名:MyThread_xinxi
* 功能:给成员变量socket赋值
*/
public MyThread_xinxi(Socket socket){
this.socket=socket;
try {
//.getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例
in=new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {//收数据
try {
String msg=in.readLine();//从客户端读数据 有数据,无数据null
if (msg!=null) {
//收:客户端发消息了,处理消息
System.out.println("消息:"+msg);
//发送
//.getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")), true);
//回
out.println("服务端给客户端发送成功");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
二、客户端:
通过 socket 连接到服务器并发送一个请求,然后等待一个响应。
1、主类:发请求,连接服务器,给服务器发消息
public class TestMain {
JFrame jFrame;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestMain().initView();
}
public void initView()
{
jFrame = new JFrame("Customer");
jFrame.setBounds(600, 100, 420, 600);
jFrame.setLayout(null);
JButton jButton=new JButton("启动");
jButton.setBounds(100, 100, 200, 50);
jFrame.add(jButton);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
//发出请求,连接服务器
Socket socket=new Socket("127.0.0.1", 9995);//IP地址,端口号
//1、给服务器发消息
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")), true);
out.println("服务器接收");
//2、接收消息
new MyThread_xinxi(socket).start();
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
jFrame.setVisible(true);
}
}
2、线程类:接收消息
/*
* 功能:处理信息
*/
public class MyThread_xinxi extends Thread{
Socket socket;//建立网络连接时使用,在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话
BufferedReader in;//接收消息
/*
* 方法名:MyThread_xinxi
* 功能:给成员变量赋值
*/
public MyThread_xinxi(Socket socket){
this.socket=socket;
try {
in=new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {//收数据
try {
String msg=in.readLine();//从客户端读数据 有数据,无数据null
if (msg!=null) {
//收:客户端发消息了,处理消息
System.out.println("消息:"+msg);
//发送
//PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")), true);
//回
//out.println("111");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}