j2se--Socket沟通
第一次接触Socket课程设计大二,我在做一个图书馆管理系统。源代码是从互联网上下载,代码天天磨,隐约中记得有Socket这么一个单词。
第二次是去年代表学校參加“河北省电子信息职业技能大赛”,接受曹建新师哥的培训。建新师哥当时用手机Android软件做client。通过局域网向电脑端server传输手机录入的信息。当时我非常诧异,client是Android平台,server是.Net平台,这两种平台是怎样在局域网内进行通信的呢?建新师哥的回答是:“通过Socket。把数据打包成JSON格式进行传输。”从此对Socket的认识便有了一种高大上的感觉。
第三次接触是通过马士兵老师的视频,这次瞬间感觉Socket--So Easy。这也验证了米老师的那句话:不怕不知道,就怕不知道。
Socket通信分为serverSocket即ServerSocket和clientSocket。
在server端,通信前须要建立和client的通信通道,建立对client通信port号的监听;在client,通信前须要定义进行通信的主机IP和port号,创建通信通道。两者都准备完成,以下就能够进行通信了。
server端代码:
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) {
//创建向client数据传输的通道
InputStream in = null;
//创建从client接收数据的通道
OutputStream out = null; try {
//建立和client的通信,并定义通信端口
ServerSocket ss = new ServerSocket(5888);
//监听client提交的请求
Socket socket = ss.accept();
in = socket.getInputStream();
out = socket.getOutputStream();
//在字节流的基础上进行包装数据流
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out); //接收client提交的请求
String s = null;
if ((s = dis.readUTF()) != null) {
System.out.println(s);
System.out.println("from:" + socket.getInetAddress());
System.out.println("port:" + socket.getPort());
} //向client数据传输
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就能够进行通信了。
server端代码有了,以下分享client代码:
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) {
//创建向server数据传输的通道
InputStream in = null;
//创建从server接收数据的通道
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);
//向server提交数据
dos.writeUTF("hey");
//接收从server返回的数据
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是怎样在server端和client进行通信的。
J2SE是JavaWeb和J2EE的基础,异常处理、IO通道、线程、网络编程、GUI编程又是J2SE的基础,所以学好Socket非常有必要。
席慕蓉说过一句名言:前世的五百次回眸才干换得今生的一次擦肩而过。所以对于以后的每次擦肩而过都应该认真对待。不要像我。和Socket都擦肩而过好多次了,今天才最终认识它。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
j2se--Socket沟通的更多相关文章
- 使用Socket沟通
当两台电脑TCP/IP协议进行通讯.平时Socket对象来表示该通信接口的两端,并通过Socket生产I/O流进行网络通信. 其中ServerSocket对象可以接收从连接的其他通信实体的请求.这个目 ...
- nginx反向代理docker容器化django
1.新建Dockerfile FROM python:3.8.5 MAINTAINER ChsterChen ENV PYTHONUNBUFFERED 1 COPY pip.conf /root/.p ...
- 一起学 Java(四) File、Try 、序列化、MySQL、Socket
一.Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基 ...
- Java Socket 编程
1. 背景 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和 ...
- 随笔 -- IO -- Socket/ServerSocket -- 系统概述
随笔 -- IO -- Socket/ServerSocket -- Echo(BIO)实例 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java ...
- 从零开始学Python第八周:网络编程基础(socket)
Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...
- Java Socket编程
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- IOS Socket 01-网络协议基础知识
1. 网络参考模型 OSI参考模型 TCP/IP参考模型 2. 七层简述 1)物理层:主要定义物理设备标准,如网线的接 ...
- Socket开发框架之框架设计及分析
虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...
- Linux IPC tcp/ip socket 编程
模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...
随机推荐
- oracle 修改dbid和dbname
一般这玩意没人修改,除非特殊情况,比如克隆数据库等等 步骤: 1.备份数据库 2.启动数据到mount状态 3.nid命令修改 (如果只是修改dbid,那么不需要dbname参数,需要更改dbname ...
- Linux如何用QQ?Linux下QQ使用的几种方案
在linux下如何使用QQ?在ubuntu11.10中如何使用QQ?或许有初涉linux的人这样问,我们可以看看ubuntusoft总结出来的几种在linux系统下用QQ的方法.前面的几种主要的方法都 ...
- c# Use Properties Instead of Accessible Data Members
advantage of properties: 1 properties can be used in data binding, public data member can not. 2 dat ...
- Javascript设计模式系列三
继承,一个类或对象继承另一个类或对象的三种方法.类式继承.原型式继承.掺元类. 一.类式继承,原型链.Extend函数. <script type="text/javascript&q ...
- 使用WPF创建无边框窗体
一.无边框窗口添加窗口阴影 实际上在WPF中添加无边框窗口的窗口阴影十分简单. 首先,设置WindowStyle="None"以及AllowsTransparency=" ...
- 北邮iptv用WindowsMediaplayer打不开的解决的方法
前言:之前我的iptv能够用,可是有次我安装了realplayer,它就偷偷把iptv文件的默认打开方式给篡改了,卸载了 realplayer之后,iptv不能直接用 ...
- org.apache.subversion.javahl.ClientException: svn: E155021: This client is too old to work with the
org.apache.subversion.javahl.ClientException: svn: E155021: This client is too old to work with the ...
- String类疑虑
Java String类疑虑: 创 拼接 String是java的经常使用类之中的一个,本质是字符数组char[].String类是final类,不可被继承. 关于String的创建,能够通过new来 ...
- WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现
原文:WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放.播放.暂停.可拖动播放进度效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,5 ...
- Hibernate-----5、持久化对象
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...