TCP程序设计基础
2016-08-30 16:07
232 查看
TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的交互过程
InetAddress类
利用该类可以获取IP地址,主机地址等信息。
看个例子:
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类用于表示服务器套接字,其主要功能是等待来自网络上的"请求",它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机
4000
存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。列队的默认大小是50.
ServerSocket类的构造方法都抛出IOException异常,分别有以下几种形式。
ServerSocket():创建非绑定服务器套接字。
ServerSocket(int port):创建绑定到特定端口的服务器套接字。
ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket类的常用方法
调用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();
}
}
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类用于表示服务器套接字,其主要功能是等待来自网络上的"请求",它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机
4000
存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。列队的默认大小是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();
}
}
相关文章推荐
- 第19章 网络通信----TCP程序设计基础
- java-TCP程序设计基础
- 80386ASM程序设计基础(五)
- 80386ASM程序设计基础(八)
- AVR_GCC程序设计基础
- 程序开发基础学习一(uml设计)
- 程序基础设计模式的解析和实现(C++)之二十-Visitor模式
- 程序设计基础,开始!!
- 程序设计基础——面向对象程序设计思想
- Linux网络编程基础--初等网络函数介绍(TCP)及示例程序
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 80386ASM程序设计基础(六)
- 80386 ASM程序设计基础 (一)
- 80386ASM程序设计基础(十)
- JavaSE基础小结--1---基于TCP的聊天程序
- 80386ASM程序设计基础(四)
- 80386ASM程序设计基础(十一)
- C#.Net 网络程序开发基础之TCP篇
- 程序设计基础
- 程序开发基础学习一(uml设计)