网络通信3-TCP

Java使用ServerSocket类和Socket类可以实现TCP通信。

1、ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后可能向请求者返回结果。
accept():侦听并接受到此套接字的连接。
bind(SocketAddress endpoint) :将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
close():关闭此套接字.
2、Socket
此类实现客户端套接字。
bind(SocketAddress bindpoint)   :将此套接字绑定到本地地址。
connect(SocketAddress endpoint) : 将此套接字连接到服务器。
connect(SocketAddress endpoint, int timeout) :将此套接字连接到服务器,并指定一个超时值。
close()  : 关闭此套接字。
getInputStream():返回此套接字的输入流。
getOutputStream():返回此套接字的输出流。
getInetAddress():返回套接字连接的地址。
getPort() : 返回此套接字连接到的远程端口。
getRemoteSocketAddress() :返回此套接字连接的远端端点的地址,如果未连接则返回 null。

3、Server

Server建立一个实现通信的服务器端点,然后等待Cient端发送的请求:

1. 创建一个ServerSocket实例,绑定到指定端口。该实例用来在指定端口监听Cient端的连接请求。

2. 调用ServerSocket实例的accept()方法来监听Cient端的连接请求,当监听到Client端请求时返回Socket实例,建立了一个和Cient端的新连接。

3.通过返回的socket实例的getInputStream()和getOutputStream()方法获取InputStream和OutputStream分别读和写数据。

4.调用ServerSocket实例的close()方法关闭与Client端的连接。

package com.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	private int port;
	private Socket socket;
	private InputStream in;
	private OutputStream out;
	/**
	 * 构造方法  
	 * @param port
	 */
	public Server(int port){
		this.port=port;
	}

	/**
	 * 创建服务器对象,并监听客户端,以获取与客户端的连接对象
	 * @return 与客户端的连接对象
	 */
	public void createServer(){
		try {
			ServerSocket server=new ServerSocket(port);
			System.out.println("服务器已经创建好,等待客户端的连接。。。");
			while(true){
				socket=server.accept();
				//启动一个线程对象来处理与某一个客户端聊天
				new Thread(){
					public void run(){
						try{
							//获取客户端的ip
							String ip = socket.getRemoteSocketAddress().toString();
							System.out.println("客户端ip为:"+ip);
							//从连接对象上获取输入、输出流
							out = socket.getOutputStream();
							in = socket.getInputStream();
							//聊天
							chat(ip);
						}catch(Exception e){
							e.printStackTrace();
						}
					}
				}.start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 聊天方法
	 */
	public void chat(String ip) throws Exception{
		String hello = "welcome to chatroom!";
		sendMsg(hello);
		String msgFromClient = "";
		//假定客户端每次发送 一行消息
		while(!msgFromClient.equals("bye")){
			String temp = "";
			//每次读取一行消息
			int i = in.read();
			while(i!=13){//当读取到\n(换行符,ASC码值为13)就结束一条消息的读取
				if(i!=10){
					temp += (char)i;
				}
				i = in.read();
			}
			msgFromClient = temp;
			System.out.println("客户端说:"+msgFromClient);
		}
		sendMsg("Good bye!");
		socket.close();
	}
	
	/**
	 * 发送消息的方法
	 * @param msg
	 */
	public void sendMsg(String msg) throws Exception{
		out.write((msg+"\r\n").getBytes());
	}
	public static void main(String[] args) {
		Server server=new Server(9090);
		server.createServer();
	}
}

4、Client

Client端的请求过程:

1.创建Socket实例,通过指定的远程服务器地址和端口来建立连接。

2.通过Socket实例的getInputStream()和getOutputStream()方法获取InputStream和OutputStream来进行数据的读写。

3.调用socket实例的close方法,关闭连接。

package com.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
	private String IP;
	private int port;
	private  InputStream in;
	private  OutputStream out;
	
	public Client(String IP,int port){
		this.IP=IP;
		this.port=port;
	}
	public void chat() throws Exception{
		try {
			Socket socket=new Socket(IP,port);
			in=socket.getInputStream();
			out=socket.getOutputStream();
			//接收服务端欢迎消息
		    System.out.println(receiveMsg());
		    //从控制台读取消息发送给服务端
			Scanner scanner=new Scanner(System.in);
			String str=scanner.nextLine();
			while(!str.equals("bye")){
				String msg=str+"\r\n";
				out.write(msg.getBytes());
				str=scanner.nextLine();
			}
			out.write(new String(str+"\r\n").getBytes());
			//接收服务端欢送消息
			System.out.println(receiveMsg());
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 接收消息
	 * @return
	 */
	public String receiveMsg() throws Exception{
		String str="";
		try {
			int i=in.read();
			while(i!=13){
				str+=(char)i;
				i=in.read();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return  str;
	}
	public static void main(String[] args) throws Exception{
		Client client=new Client("localhost",9090);
		client.chat();
	}

}

运行结果:

服务端控制台输出:

服务器已经创建好,等待客户端的连接。。。
客户端ip为:/127.0.0.1:56620
客户端说:hello
客户端说:bye


客户端控制台输出:

welcome to chatroom!
hello
bye


Good bye!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值