Java网络编程之TCP程序设计

在Java中使用Socket(套接字)来完成TCP程序的开发,使用此类可以方便的建立可靠的、双向的、持续的、点对点的通信连接。服务器端使用ServerSocket等待客户端的连接,,而每一个客户端都是用一个Socket对象表示。

1.ServerSocket类与Socket类

ServerSocket类主要运用在服务器端开发,用于接收客户端的连接请求。常用方法:

类型 方法 描述
构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
Socket
accept()

侦听并接受到此套接字的连接。
InetAddress getInetAddress() 返回此服务器套接字的本地地址。
boolean
isClosed()

返回 ServerSocket 的关闭状态。
void
close()

关闭此套接字。

服务器端每次运行都要使用accept()方法等待客户端连接,此方法执行之后服务器端进入阻塞状态,直到客户端连接之后程序才向下继续执行。此方法返回Socket类型,每一个Socket都表示一个客户端对象。Socket常用方法:

类型 方法 描述
构造方法
Socket(String host, int port)

创建一个流套接字并将其连接到指定主机上的指定端口号。
InputStream
getInputStream()

返回此套接字的输入流。
OutputStream
getOutputStream()

返回此套接字的输出流。
void close() 关闭此套接字。
boolean isClosed() 返回套接字的关闭状态。

在客户端,程序可以通过Socket类的getInputStream()方法取得服务器的输出信息;在服务器端,可以通过getOutputStream()方法取得客户端的输出信息。

2.服务器向客户端输出

服务器端程序:

package org.demo.net;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class HelloServer {
    public static void main(String[] args) {
        ServerSocket server=null;
        Socket client=null;
        PrintStream out=null;
        try {
            server=new ServerSocket(8888);
            System.out.println("服务器运行,等待客户端连接");
            client=server.accept();
            String str="Hello!";
            out=new PrintStream(client.getOutputStream());
            out.println(str);
            out.close();
            client.close();
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

运行结果:

客户端程序:

package org.demo.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class HelloClient {
    public static void main(String[] args) {
        Socket client = null;
        try {
            client = new Socket("localhost",8888);//指定连接的主机和端口
            BufferedReader buf = null;//声明BufferedReader对象,接受信息
            //取得客户端的输入流
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String str = buf.readLine();//读取信息
            System.out.println("服务器端输出内容:"+str);
            client.close();
            buf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

运行结果:

此时客户端从服务器端将信息读取进来,完毕后,因为服务器端此时只能处理一次连接请求,所以也将关闭。

3.Echo程序

是网络编程通信交互的一个经典案例,称为回应程序,不同于之前的服务器端每次执行完毕后服务器都会退出,本程序应用循环的方式使用accept(),这样,每一个客户端执行完毕后服务器端都可以重新等待用户连接。

服务器端程序:

package org.demo.net;

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

public class EchoServer {
    public static void main(String[] args) {
        ServerSocket server = null;
        Socket client = null;
        PrintStream out = null;
        BufferedReader buf = null;
        try {
            server = new ServerSocket(8888);
            boolean f = true;
            while(f){
                System.out.println("服务器运行,等待客户端连接。");
                client = server.accept();
                //得到客户端的输入信息
                buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
                //实例化客户端的输出流
                out = new PrintStream(client.getOutputStream());
                boolean flag = true;//表示一个客户端是否操作完毕

                while(flag){
                    String str = buf.readLine();
                    if(str == null || "".equals(str)){
                        flag = false;
                    }else{
                        if("bye".equals(str)){
                            flag = false;
                        }else{
                            out.println("ECHO:"+str);//向客户端回显信息
                        }
                    }
                }
                out.close();
                client.close();
            }
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

运行结果:

客户端程序:

package org.demo.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class EchoClient {
    public static void main(String[] args) throws IOException {
        Socket client = null;
        client = new Socket("localhost",8888);
        BufferedReader buf = null;
        PrintStream out = null;
        BufferedReader input = null;
        //从键盘接收数据
        input = new BufferedReader(new InputStreamReader(System.in));
        out = new PrintStream(client.getOutputStream());
        //从服务器端接收信息
        buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
        boolean flag = true;
        while(flag){
            System.out.println("输入信息:");
            String str = input.readLine();//从键盘接收信息
            out.println(str);//向服务器输入信息
            if("bye".equals(str)){
                flag = false;
            }else{
                String echo=buf.readLine();//接收ECHO信息
                System.out.println(echo);//输出ECHO信息
            }
            client.close();
            buf.close();
        }
    }

}

运行结果:

4.服务器上的多线程

ExThread.java:

package org.demo.net;

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

public class ExThread implements Runnable{
    private Socket client = null;
    public ExThread(Socket client){
        this.client = client;
    }
    public void run(){
        PrintStream out = null;
        BufferedReader buf = null;
        try{
            buf = new BufferedReader(new InputStreamReader
                    (client.getInputStream()));
            out = new PrintStream(client.getOutputStream());
            boolean flag = true;
            while(flag){
                String str = buf.readLine();
                if(str==null || "".equals(str)){
                    flag = false;
                }else{
                    if("bye".equals(str)){
                        flag = false;
                    }else{
                        out.println("ECHO:"+str);
                    }
                }
            }
            out.close();
            client.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

主要功能是接收每一个客户端的Socket,并通过循环的方式接收客户端的输入信息及向客户端输出信息。

ExThreadServer.java:

package org.demo.net;

import java.net.ServerSocket;
import java.net.Socket;

public class ExThreadServer {
    public static void main(String[] args) throws Exception{
        ServerSocket server = null;
        Socket client = null;
        server = new ServerSocket(8888);
        boolean f = true;
        while(f){
            System.out.println("服务器运行,等待客户端连接。");
            client = server.accept();
            new Thread(new ExThread(client)).start();//实例化并启动一个线程对象
        }
        server.close();
    }
}
时间: 2024-11-05 11:35:12

Java网络编程之TCP程序设计的相关文章

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

Java网络编程之TCP、UDP

Java网络编程提供了两种协议:TCP(传输控制协议)和UDP(数据报协议).TCP(Transmission Control Protocol)是一种可靠的传输协议,传输时会采用"三次握手"端的方式建立连接,以保证数据的可靠性和安全性:而UDP(User Datagram Protocol)协议是一种不可靠的传输协议,发送的数据不一定能够接受的到,网上的聊天是工具一般采用的此协议.下面将详细的接受TCP和UDP的使用以及相应的编码. 一.TCP网络通信 Java中使用Socket(套

Java网络编程之TCP通信

一.概述 Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信. Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行server端操作的基础类,该类执行于server,监听入站TCP连接.每一个socketserver监听server的某个port.当远程主机的client尝试连接此port时.server就被唤醒.并返回一个表示两台主机之间socket的正常Socket对象.

[学习笔记]Java网络编程之TCP通讯

1. Socket类 1.1 概述 用于创建客户端套接字,以此建立TCP链接. 1.2 构造器 Socket() Socket(InetAddress address, int port) Socket(String host, int port) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) Socket(String host, int port, InetAddress localAd

Java网络编程之TCP网络编程

一.基于Socket的TCP编程 Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示: 二.客户端Socket的工作过程(四个基本步骤) 1.创建Socket根据指定服务端的IP地址或端口号构造Socket类对象.若服务器端响应,则建立客户端到服务器的通信线路:若连接失败,会出现异常.2.打开连接到Socket的输入出流使用getlnputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输.3.按照一定的协议对Socket

Java网络编程之tcp的socket通信

1.客户端MyClient.java 1 import java.io.*; 2 import java.net.*; 3 4 public class MyClient 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.1" , 30000); 9 // 客户端启动ClientThread线程不断读取来自服务器的数据 10 new Th

4.Java网络编程之TCP/UDP

常见传输协议: UDP , TCP UDP协议:    特点:         1.将数据及源和目的封装成数据包中,不需要建立连接         2.每个数据包的大小限制在64K内         3.因无连接,是不可靠协议         4.不需要建立连接,速度快 举例:比如你向家里邮寄一个包裹,无论家里此时是否有人,都会发送.当快递员发送到你家时,如果有人,家里人就收到了包裹,如果家里此时没有人,包裹(数据包)就被丢弃了. 自我理解: 当我们建立连接后,你说了一句:"你吃过饭了么?&qu

Java网络编程之UDP程序设计

1.UDP简介 使用UDP发送消息,对方不一定收到,因为所有的信息使用数据报的形式发送出去,这就要求客户端要始终等待接收服务器发送过来的信息,在Java中使用DatagramSocket类和DatagramPacket类完成UDP程序的开发. 2.程序实现 使用DatagramPacket类包装一条要发送的信息,之后使用DatagramSocket类用于完成信息的发送操作.DatagramPacket类的常用方法: 类型 方法 描述 构造 DatagramPacket(byte[] buf, i

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S