TCP程序设计基础

TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的交互过程


InetAddress类

利用该类可以获取IP地址,主机地址等信息。

方法

返回值

说明

getByName(String  host)

InetAddress

获取与Host相对应的InetAddress对象

getHostAddress()

String

获取InetAddress对象所含的IP地址

getHostName()

String

获取此IP地址的主机名

getLocalHost()

InetAddress

返回本地主机的InetAddress对象

看个例子:

package kop;
import java.net.*;
public   class op {


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(UnknownHostException e){
e.printStackTrace();
}
}
}


结果:

本机名:MS-20150811AZPJ
本机IP地址:192.168.31.125


ServerSocket类

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

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

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

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

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


ServerSocket类的常用方法


方法

返回值

说明

Accept()

Socket

等待客户机的连接。若连接,则创建一套接字

IsBound()

Boolean

判断ServerSocket的绑定状态

GetInetAddress()

InetAddress

返回此服务器套接字的本地地址

IsClosed()

Boolean

返回服务器套接字的关闭状态

Close()

Void

关闭服务器套接字

Bind(SocketAddress endpoint)

Void

将ServverSocket绑定到特定地址(IP地址和端口号)

GetInetAddress()

Int

返回服务器套接字等待的端口号

 

调用ServerSocket类的accept()方法会返回一个和客户端Socket对象相连接的Socket对象,服务器端的Socket对象使用getOutputStream()方法获得的输出流将指向客户端Socket对象使用getInputStream()方法获得的那个输入流;同样,服务器端的Socket对象使用getInputStream()方法获得的输入流将指向客户端Socket对象使用getOutputStream()方法获得的那个输出流。也就是说,当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。

注意:

accept()方法会堵塞线程的继续执行,直到接收到客户的呼叫。如果没有客户呼叫服务器,那么System.out.printIn("连接中")语句将不会执行。语句如果没有客户请求,accept()方法没有发生阻塞,肯定是程序出现了问题。通常是使用了一个还在被其他程序占用的端口号,ServerSocket绑定没有成功。


TCP网络程序


明白了TCP程序工作的过程,就可以编写TCP服务器程序了。在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。下面是简单的单向通信的实例。

本实例是一个TCP服务器端程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息。


package kop;
import java.util.*;
import java.io.*;
import java.net.*;
public  class op{
    private BufferedReader reader;
    private ServerSocket server;
    private Socket socket;
    void getserver(){
        try{
            server=new ServerSocket(898);
            System.out.println("服务器套接字已经创建方法");
            while(true){
                System.out.println("等待客户机的连接");
                socket=server.accept();
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                getClientMessage();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    private 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(IOException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        op tcp=new op();
        tcp.getserver();
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值