基于Java的Socket网络编程,TCP通信,服务器端与客户端的单向通信

前言: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();
		}
	}
}
运行结果如下:


猜你喜欢

转载自blog.csdn.net/qq_39034748/article/details/80991788