JAVA中TCP程序设计基础

TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另外称为客户机程序,两个的功能和编写方法不大一样。服务器端与客户端的交互过程如下:

(1)、服务器程序创建一个ServerSocket,调用accept()方法等待客户机来连接

(2)、客户端程序创建一个Socket,请求余服务器建立连接

(3)、服务器接收客户机的连接请求,同时创建一个新的Socket与客户建立连接。服务器继续等待新的请求

 

一、InetAddress类

java.net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息,常用方法如下:

InetAddress类常用方法
方法 返回值 说明
getByName(String host) InetAddress 获取与host相对应的InetAddress对象
getHostAddress() String 获取InetAddress对象所含的IP地址
getHostName() String 获取此IP地址的主机名
getLocalHost() InetAddress 返回本地主机的InetAddress对象

通过以下实例来进行说明:
 

import java.net.InetAddress;

public class Address {
	public static void main(String args[]) {
		InetAddress ip;
		try {
			ip = InetAddress.getLocalHost();
			String localName = ip.getHostName();
			String localIp = ip.getHostAddress();
			System.out.println("本机名:"+localName);
			System.out.println("本机IP地址:"+localIp);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}
/*输出结果如下:
本机名:Timmor
本机IP地址:192.168.0.104
*/

二、ServerSocket类

java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是等待来自网上的“请求”,它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的 连接请求被拒绝。队列的默认大小是50.

ServerSocket类的构造方法都抛出IOException异常,分别有以下几种形式。

1、ServerSocket():创建非绑定服务器套接字

2、ServerSocket(int port):创建绑定到特定端口的服务器套接字

3、ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号

4、ServerSocket(int port,int backlog,InetAddress bindAddress):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。

ServerSocket类的常用方法如下:

ServerSocket类的常用方法
方法 返回值 说明
accept() Socket 等待客户机的连接,若连接,则创建一套接字
isBound() boolean 判断ServerSocket的绑定状态
getInetAddress() InetAddress 返回此服务器套接字的本地地址
isClosed() boolean 返回服务器套接字的关闭状态
close() void  关闭服务器套接字
bind(SocketAddress endpoint) void 将ServerSocket绑定到特定地址
getInetAddress() int 返回服务器套接字等待的端口号

三、TCP网络程序

在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户就发送消息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接受数据,通过下列简单实例进行说明。

TCP服务器端程序:

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTcp {
	private BufferedReader reader;
	private ServerSocket server;
	private Socket socket;
	void getServer() {
		try {
			server = new ServerSocket(8998);
			System.out.println("服务器套接字已经创建成功");
			while(true) {
				System.out.println("等待客户机连接...");
				socket = server.accept();
				reader = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				getClientMessage();
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	private void getClientMessage() {
		try {
			while(true) {
				System.out.println("客户机:"+reader.readLine());
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		try {
			if(reader != null) {
				reader.close();
			}
			if(socket != null) {
				socket.close();
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	public static void main(String args[]) {
		MyTcp tcp = new MyTcp();
		tcp.getServer();
	}
}

运行结果如下:

TCP客户机端程序:

package test;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;

public class MyClien extends JFrame{
	private PrintWriter writer;
	Socket socket;
	private JTextArea ta = new JTextArea();
	private JTextField tf = new JTextField();
	Container cc;
	public MyClien(String title) {
		super(title);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		cc = this.getContentPane();
		final JScrollPane sp = new JScrollPane();
		sp.setBorder(new BevelBorder(BevelBorder.RAISED));
		getContentPane().add(sp,BorderLayout.CENTER);
		sp.setViewportView(ta);
		cc.add(tf,"South");
		tf.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO 自动生成的方法存根
				writer.println(tf.getText());
				ta.append(tf.getText()+'\n');
				ta.setSelectionEnd(ta.getText().length());
				tf.setText("");
			}
		});
	}
	private void connect() {
		ta.append("尝试连接\n");
		try {
			socket = new Socket("127.0.0.1",11111);
			writer = new PrintWriter(socket.getOutputStream(),true);
			ta.append("完成连接\n");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	public static void main(String agrs[]) {
		MyClien clien = new MyClien("向服务器送数据");
		clien.setSize(200,200);
		clien.setVisible(true);
		clien.connect();
	}
}

运行结果如下:

当客户端输入TTTTT后,服务器也会收到TTTTT:

 

发布了61 篇原创文章 · 获赞 1 · 访问量 1305

猜你喜欢

转载自blog.csdn.net/qq_29440983/article/details/104649225