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:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值