`

java 网络协议(一)Tcp

阅读更多
1,简化的服务器端程序
package tcp;

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

//简单化的服务器端程序,用到ServerSocket类,不做任何事,只是在碰到有连接的时候停顿3秒
public class Techo {
	public static void main(String[] args) {
		
		try {
			ServerSocket server = new ServerSocket(8123); //如果端口已占用会出现异常,例如运行两次此程序第二个会有异常
			while(true){
				System.out.println("Listening....");
				Socket socket = server.accept(); //监听到了的连接,这个调用会阻塞,因此程序会挂起,直到一台客户端计算机连接到它
				InetAddress addr = socket.getInetAddress(); //得到客户端的ip地址
				System.out.println("connection made to "+addr.getHostName()+"("+addr.getHostAddress()+")");
				
				pause(3000);
				socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void pause(int i) {

		try {
			Thread.sleep(i);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

先运行此程序,控制台显示Listening....,再在命令行中运行  telnet localhost 8123,显示
Listening....
connection made to bupt(0:0:0:0:0:0:0:1)
Listening....
说明服务器一直在监听,直到有客户端连接为止

2,单连接,只连接一次就关闭服务器
package tcp;

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

//允许单连接的

public class BeerServer {
	public static void main(String[] args) {
		
		try {
			ServerSocket server = new ServerSocket(1234); //如果端口已占用会出现异常,例如运行两次此程序第二个会有异常
		
				System.out.println("Listening....");
				Socket socket = server.accept(); //监听到了的连接,这个调用会阻塞,因此程序会挂起,直到一台客户端计算机连接到它
				InetAddress addr = socket.getInetAddress(); //得到客户端的ip地址
				System.out.println("connection made to "+addr.getHostName()+"("+addr.getHostAddress()+")");
				
				server.close();//no more connect,只要建立一个连接后就关闭
//				PrintStream不做什么,必须和流联系在一起
				PrintStream psstream = new PrintStream(socket.getOutputStream());
				for(int i =10;i>=0;i--){
					psstream.println(i+" bottles of beer on the wall");
				}
				psstream.close();
				socket.close();
		
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


先运行此程序,再在命令行中运行  telnet localhost 1234
如下图所示


2,客户端输入控制服务器端输出
package tcp;

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

//客户端指定信息来控制服务器输出

public class BeerServer1 {
	public static void main(String[] args) {
		
		try {
			ServerSocket server = new ServerSocket(1234); //如果端口已占用会出现异常,例如运行两次此程序第二个会有异常
		
				System.out.println("Listening....");
				Socket socket = server.accept(); //监听到了的连接,这个调用会阻塞,因此程序会挂起,直到一台客户端计算机连接到它
				InetAddress addr = socket.getInetAddress(); //得到客户端的ip地址
				System.out.println("connection made to "+addr.getHostName()+"("+addr.getHostAddress()+")");
				
				server.close();//no more connect,只向单个客户端显示消息
				
				
//				PrintStream不做什么,必须和流联系在一起
				PrintStream psstream = new PrintStream(socket.getOutputStream());
				
//		==========	与上一个不同之处 =============
				//ask for count
				psstream.print("count? ");
				BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				
//				read and parse it
				String line = input.readLine();
				psstream.println(" ");
				int count = Integer.parseInt(line);
//		==========	与上一个不同之处 =============				
				for(int i =count;i>=0;i--){
					psstream.println(i+" bottles of beer on the wall");
				}
				psstream.close();
				socket.close();
		
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


先运行此程序,再在命令行中运行  telnet localhost 1234,输入count后




3,tcp连接传递数据
客户端
package tcp.data;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端取出浮点型数据pi值
public class DataClient {
	public static void main(String[] args) {

		try {
			Socket socket = new Socket(args[0],1234);
			
			DataInputStream dis = new DataInputStream(socket.getInputStream());
			float f = dis.readFloat();
			System.out.println("PI="+f);
			dis.close();
			socket.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

服务器端
package tcp.data;

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

//一个特定的java服务器端程序能用专门的流传送输入的数据或者对象
public class DataServer {
	public static void main(String[] args) {
		
		try {
			ServerSocket server = new ServerSocket(1234); //如果端口已占用会出现异常,例如运行两次此程序第二个会有异常
		
				System.out.println("Listening....");
				Socket socket = server.accept(); //监听到了的连接,这个调用会阻塞,因此程序会挂起,直到一台客户端计算机连接到它
				
				DataOutputStream dsstream = new DataOutputStream(socket.getOutputStream());
				dsstream.writeFloat(3.14159265f);
				dsstream.close();
				socket.close(); 
		
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

执行结果:




4,tcp传递对象
客户端
package tcp.obj;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;

//一个特定的java客户端程序,从服务器端读对象
public class ObjClient {

	public static void main(String[] args) throws ClassNotFoundException {
		try {

			Socket socket = new Socket(args[0], 1234);

			ObjectInputStream ois = new ObjectInputStream(socket
					.getInputStream());
			List hash = (List) ois.readObject();

			System.out.println(hash);
			ois.close();
			socket.close();

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

服务器端
package tcp.obj;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

//服务器端,对象传递数据
public class ObjServer {
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(1234); //如果端口已占用会出现异常,例如运行两次此程序第二个会有异常
		
             List<String> list = new ArrayList<String>();		
             list.add("first");
             list.add("second");
			while(true){ //一直在监听
			    System.out.println("Listening....");
				Socket socket = server.accept(); //监听到了的连接,这个调用会阻塞,因此程序会挂起,直到一台客户端计算机连接到它
				
				ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
				oos.writeObject(list);
				oos.close();
				socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}



5,以上均是单客户端,以下是用多线程实现的多个客户端同时响应的服务器端程序
package tcp.multiclient;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
//使用线程,允许服务器一次处理多个客户端的请求

public class MTServer extends Thread {  //或implements Runnable
	Socket client;
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(1234);
		System.out.println("Listening....");

		while (true) { // 一直监听,每监听到一个连接,启动一个线程  ,可以考虑用线程池????
		Socket socket = server.accept();
		System.out.println("Connected....");	
		new MTServer(socket).start(); // 执行run方法
//			new Thread(new MTServer(socket)).start(); 如果是实现runnable接口
		}
	}
	public MTServer(Socket client) {
		super();
		this.client = client;
	}
	public void run() {
		try {
			PrintStream psstream = new PrintStream(client.getOutputStream());
			for (int i = 10; i >= 0; i--) {
				psstream.println(i + " bottles of beer on the wall");
			}
			psstream.close();
			client.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


6,用java中的zip减少发送数据量
服务器端
package tcp.zipUnzip;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.zip.GZIPInputStream;
//使用java的压缩类减少数据量,服务器端
public class CompRcv {
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		ServerSocket server = new ServerSocket(Integer.parseInt(args[0]));
		System.out.println("Listening....");
		Socket socket = server.accept();
		[color=red]GZIPInputStream zip = new GZIPInputStream(socket.getInputStream());[/color] 
		while(true){
			int c;
			c = zip.read();
			if(c==-1)break;
			System.out.println((char)c); //中文读不出来
		}
	}
}

客户端
package tcp.zipUnzip;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.zip.GZIPOutputStream;

//客户端发送压缩文件到服务器,参数为主机名,端口号,发送的文件
public class CompSend {

	public static void main(String[] args) throws NumberFormatException, UnknownHostException, IOException {
		Socket socket = new Socket(args[0],Integer.parseInt(args[1]));	
		[color=red]GZIPOutputStream zip = new GZIPOutputStream(socket.getOutputStream());[/color]
		String line;
		BufferedReader reader = new BufferedReader(new FileReader(args[2]));
		while(true){
			line = reader.readLine();
			if(line==null)break;
			line = line+"\n";
			zip.write(line.getBytes(),0,line.length());
		}
		zip.finish();
		zip.close();
		socket.close();
	}
}

执行结果和上面无两样
  • 大小: 27 KB
  • 大小: 4.9 KB
  • 大小: 22.9 KB
  • 大小: 7.2 KB
  • 大小: 6 KB
  • 大小: 7.1 KB
  • 大小: 7 KB
分享到:
评论

相关推荐

    Java网络编程 TCP协议 聊天室

    Java网络编程是构建分布式应用程序的关键技术之一,TCP(Transmission Control Protocol)协议作为互联网上最基础的传输协议,为两台计算机之间提供可靠的数据传输服务。在这个聊天室项目中,我们将探讨如何利用Java...

    Java网络编程之TCP协议下—上传文件到服务器程序

    在Java网络编程中,TCP(Transmission Control Protocol)协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP提供了一种可靠的数据传输服务,确保数据的正确顺序和完整性,非常适合文件传输。本教程将...

    java网络通信TCP

    Java网络通信是一个重要的主题,特别是在开发分布式系统和网络应用程序时。TCP(传输控制协议)是互联网上广泛使用的面向连接的、可靠的传输层协议。在这个Java项目中,我们专注于使用TCP进行网络通信,提供了完整的...

    java版聊天软件 TCP协议 附带源码

    【Java版聊天软件基于TCP协议实现】 在计算机网络通信领域,TCP(Transmission Control Protocol)是一种面向...此外,对于初学者,源码也是一个很好的学习资源,可以加深对Java网络编程的理解,进一步提升编程技能。

    Java 网络协议源码

    Java网络协议源码是深入理解Java网络编程的关键资源,它涵盖了网络通信中各种协议的实现细节。这份资料可能包括了TCP/IP、HTTP、FTP等常用网络协议的Java源代码实现,对于开发者来说,是一个深入了解网络协议工作...

    JAVA写的利用ModbusTCP协议控制现场设备

    后来发展出了Modbus TCP/IP,将Modbus协议与TCP/IP网络协议栈结合,提高了其在网络环境下的应用能力,使得设备能够通过以太网进行通信。 2. **ModbusTCP**: ModbusTCP是Modbus协议的网络版本,它使用TCP/IP协议来...

    java TCP协议客户机

    在IT行业中,TCP(传输控制协议)是一种广泛用于网络通信的协议,它是互联网协议栈(TCP/IP协议族)的一部分。TCP提供了一种面向连接、可靠的、基于字节流的通信服务,确保数据能够准确无误地从一个端点传送到另一个...

    用Java实现对IP/TCP协议数据包的拦截和分析

    在IT领域,网络通信是核心部分之一,而IP/TCP协议是互联网协议栈中的关键层次。本文将深入探讨如何利用Java编程语言实现对IP和TCP协议数据包的拦截与分析,以便获取IP地址的详细信息。 首先,我们需要理解IP...

    java Tcp协议验证

    在IT行业中,TCP(传输控制协议)是一种广泛用于互联网通信的协议,因为它提供了可靠的、面向连接的数据传输服务。本文将详细探讨使用Java编程语言实现TCP协议验证的相关知识点,包括TCP的特性、可靠传输机制、丢包...

    java 通过modbus rtu协议,tcp 协议 通讯源码

    Java编程语言在工业自动化和设备通信领域中广泛应用于实现Modbus通信协议,这是一种标准化的通信协议,用于设备间的数据交换。本项目提供了基于Modbus RTU(远程终端单元)和TCP(传输控制协议)的通信源码,适用于...

    java ModbusTCP通讯

    Java ModbusTCP通信是工业自动化领域中常见的通信协议,它基于TCP/IP网络协议,用于设备间的通信。在Java中实现ModbusTCP通信,主要是通过创建Socket连接,与Modbus服务器进行数据交换。以下是对这个主题的详细解释...

    java TCP协议服务器

    在IT领域,TCP(传输控制协议)是一种广泛用于网络通信的协议,因为它提供了一种可靠的、面向连接的数据传输服务。本文将深入探讨如何使用Java来实现一个基于TCP协议的服务器,我们将围绕`TCPSocketServer.java`源...

    基于java的modbus TCP通信

    Modbus 协议是一项应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信,包括 ASCII、RTU、TCP 三种报文类型。 Modbus TCP 数据帧由 MBAP 和 PDU 两部分组成。MBAP 是报文头,长度为...

    java网络协议内幕

    根据提供的信息,“Java网络协议内幕”这本书主要探讨了Java在处理网络通信时涉及的各种协议和技术。这是一本针对具有一定Java编程经验的开发人员所撰写的书籍,旨在深入讲解Java在网络应用方面的实现细节与最佳实践...

    modbusTCP协议java实现(带注释)

    ### ModbusTCP协议Java实现详解 #### 一、概述 Modbus协议是一种广泛应用于工业自动化领域的通信协议,它主要用于在设备之间进行数据交换。随着工业网络的发展,ModbusTCP/IP应运而生,该协议结合了Modbus的功能与...

    Java网络开发--TCP协议

    Java网络开发中,TCP协议是基础且至关重要的部分。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,通过Socket类和ServerSocket类,开发者可以实现基于TCP的网络通信。 TCP...

    TCP_Java.rar_TCP java_java Tcp _实现tcp协议

    在IT行业中,网络通信是至关重要的一个领域,TCP(Transmission Control Protocol...综上所述,"TCP_Java.rar"提供了关于Java实现TCP协议的基础知识和实践经验,对于深入理解TCP协议和Java网络编程有着重要的学习价值。

    java写的一个简单基于tcp协议的多用户聊天系统

    在本项目中,我们探讨的是一个使用Java(J2SE)编写的简单多用户聊天系统,该系统基于TCP协议。TCP(传输控制协议)是一种面向...总的来说,这个简单的多用户聊天系统是学习Java网络编程和多线程处理的绝佳实践项目。

Global site tag (gtag.js) - Google Analytics