前言:TCP服务器端与客户端之间的交互过程如下:
1、服务器程序创建一个ServerSocket(服务器端套接字),并且调用ServerSocket里面的accept()方法来等待客户机的连接
2、客户端程序创建一个Socket(这个套接字里面包含了服务器的IP地址,以及端口号)与服务器连接
3、服务器端收到客户端的连接请求后,同时建立起一个新的Socket与客户连接。服务器继续等待新的请求
Socket网络编程
在此之前,还应该熟悉输入输出流的知识,掌握输入输出流的各大类
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class socket {//服务器端程序
private ServerSocket serversocket;//服务器端套接字
private Socket socket;//套接字
private BufferedReader reader;//输入流
public void getserve() {
try {//捕获异常
serversocket=new ServerSocket(1025);
System.out.println("服务器端套接字已创建成功");
while(true) {
System.out.println("正在等待客户端的连接...");
socket=serversocket.accept();//监听客户端,直到返回一个与客户端Socket相连接的Socket对象,通道建立
System.out.println("与客户端连接成功");
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得BufferedReader输入流
getclientmessage();
}
}catch(Exception e) {
e.printStackTrace();//输出异常信息
}
}
public void getclientmessage() {//获得客户消息并输出
try {
while(true) {
System.out.println("客户机:"+reader.readLine());//服务器端读取来自客户端发来的信息
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(reader!=null) reader.close();//关闭流
if(socket!=null) socket.close();//关闭套接字
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new socket().getserve();
new client().connection();
}
}
class client {//客户端程序
private Socket socket;
private PrintWriter writer;//输出流
private JFrame jf;//窗体
private JTextField jtf;//文本框
private JTextArea jta;//文本域
public client() {//构造方法
//设置客户端界面
jf=new JFrame("客户端");
jf.setLayout(new BorderLayout());//窗体使用边界布局
jf.setSize(300, 280);
jf.setVisible(true);
jta=new JTextArea();
jtf=new JTextField();
jf.add(jta);
jf.add(jtf,BorderLayout.SOUTH);//将文本框放置在窗体的下部
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jtf.addActionListener(new ActionListener() {//为文本框添加事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
writer.println(jtf.getText());//将文本框中信息写入流
jta.append(jtf.getText()+'\n');//将文本框中信息显示在文本域中
jtf.setText(null);//将文本框清空
}
});
}
public void connection() {//连接套接字的成员方法
jta.append("尝试连接服务器\n");
try {
socket=new Socket("10.91.41.44",1025);//10.91.41.44是本机IP地址,1025是端口号,必须和服务器端口号一致
jta.append("连接成功\n");//在文本域中输出“连接成功”
writer=new PrintWriter(socket.getOutputStream(),true);//连接好服务器后,就必须获得输出流
}catch(Exception e) {
e.printStackTrace();
}
}
}
运行结果如下: