相见恨晚--Socket通信

第一次接触Socket是大二时的课程设计,当时做的是图书管理系统,源码都是网上下载,考试周拿着代码天天磨,隐约中记得有Socket这么一个单词。

第二次是去年代表学校参加“河北省电子信息职业技能大赛”,接受曹建新师哥的培训。建新师哥当时用手机Android软件做客户端,通过局域网向电脑端服务器传输手机录入的信息。当时我很诧异,客户端是Android平台,服务器是.Net平台,这两种平台是如何在局域网内进行通信的呢?建新师哥的回答是:“通过Socket,把数据打包成JSON格式进行传输。”从此对Socket的认识便有了一种高大上的感觉。

第三次接触是通过马士兵老师的视频,这次瞬间感觉Socket--So Easy。这也验证了米老师的那句话:不怕不知道,就怕不知道。

Socket通信分为服务器Socket即ServerSocket和客户端Socket。

在服务器端,通信前需要建立和客户端的通信通道,建立对客户端通信端口号的监听;在客户端,通信前需要定义进行通信的主机IP和端口号,创建通信通道。两者都准备完毕,下面就可以进行通信了。

服务器端代码:

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

public class TCPServer {

	public static void main(String[] args) {
		//创建向客户端传输数据的通道
		InputStream in = null;
		//创建从客户端接收数据的通道
		OutputStream out = null;

		try {
			//建立和客户端的通信,并定义通信端口
			ServerSocket ss = new ServerSocket(5888);
			//监听客户端提交的请求
			Socket socket = ss.accept();
			in = socket.getInputStream();
			out = socket.getOutputStream();
			//在字节流的基础上进行包装数据流
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);

			//接收客户端提交的请求
			String s = null;
			if ((s = dis.readUTF()) != null) {
				System.out.println(s);
				System.out.println("from:" + socket.getInetAddress());
				System.out.println("port:" + socket.getPort());
			}

			//向客户端传输数据
			dos.writeUTF("hi,hello");
			dos.close();
			dis.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

由于数据流的readUTF()方法和writeUTF()方法都是阻塞式,所以当A向B发送数据后,如果B没有响应,A是无法继续发送数据的,只能傻傻的等待。这个过程好比TCP/IP协议的三次握手,1:A呼叫B,“我是A,收到请回答?”;2:B回应A,“我是B,收到”;3:A继续说,“我想请你吃饭,你有时间吗?”。下面A和B就可以进行通信了。

服务器端代码有了,下面分享客户端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
	public static void main(String[] args) {
		//创建向服务器传输数据的通道
		InputStream in = null;
		//创建从服务器接收数据的通道
		OutputStream out = null;
		try {
			//定义进行通信的主机IP和端口号
			Socket socket = new Socket("localhost", 5888);
			in = socket.getInputStream();
			out = socket.getOutputStream();
			//在字节流的基础上进行包装数据流
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);
			//向服务器提交数据
			dos.writeUTF("hey");
			//接收从服务器返回的数据
			String s = null;
			if ((s = dis.readUTF()) != null) {
				System.out.println(s);
			}
			dos.close();
			dis.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

通过这个简单的小Demo,我们就可以清晰的观察到Socket是如何在服务器端和客户端进行通信的。

J2SE是JavaWeb和J2EE的基础,异常处理、IO通道、线程、网络编程、GUI编程又是J2SE的基础,所以学好Socket很有必要。

席慕蓉说过一句名言:前世的五百次回眸才能换得今生的一次擦肩而过。所以对于以后的每次擦肩而过都应该认真对待,不要像我,和Socket都擦肩而过好多次了,今天才终于认识它。

相见恨晚--Socket通信

时间: 2024-08-11 15:24:16

相见恨晚--Socket通信的相关文章

TCP及socket通信原理

一.网络互联模型 因特网在刚面世时,只有同一制造商生产的计算机才能彼此通信,制定网络互联模型的目的就是为异种的计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考. 互联参考模型: OSI七层模型(Open System Interconnect):应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 DoD四层模型:是OSI七层模型的浓缩版,包括 进程/应用层.主机到主机层.因特网层.网络接入层 以上两种模型是层次型的,分层模型的优点主要在于: ①将网络

java socket通信-传输文件图片--传输图片

ClientTcpSend.java   客户端发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.InetSocketAddress; import java.net.Socket; public class ClientTcpSend { public static String clien

c# socket通信较完善方案

c#的socket通信应用.文件较多.附件为工程.  core AbstractBytesWorker.cs    字节工作器(基类),用于用于同一不同功能的字节工作器 BinaryHand.cs  2进制处理器.  ThDispose.cs 处理回收相关 crc  entity ThPersonInfo.cs manager ThSocketManager.cs  ThSocketManagerBusiness.cs 所有的业务 request RequestCode.cs  请求码 ThPr

深入浅出讲解:php的socket通信

深入浅出讲解:php的socket通信 对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协

Android简单Socket通信demo

一.Android Socket 通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信

php的socket通信

对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网

Socket通信(转)

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

基于Java NIO的Socket通信

Java NIO模式的Socket通信,是一种同步非阻塞IO设计模式,它为Reactor模式实现提供了基础. 下面看看,Java实现的一个服务端和客户端通信的例子. NIO模式的基本原理描述如下: 服务端打开一个通道(ServerSocketChannel),并向通道中注册一个选择器(Selector),这个选择器是与一些感兴趣的操作的标识(SelectionKey,即通过这个标识可以定位到具体的操作,从而进行响应的处理)相关联的,然后基于选择器(Selector)轮询通道(ServerSock

Socket通信

1:ServerSocket. 构造方法:ServerSocket(int port) : 创建一个绑定端口号的服务器 accept();监听并且接受Socket,并且返回一个Socket通信包. 2:Socket. 构造方法:Socket(String host,int port); 字节流: getOutputStream(); 输出流方法 (outputStream类) getInputStream();输入流方法 字符流: PrintWriter pw = new printWriter