java socket之传输实体类对象
一、TCP编程
TCP协议是面向连接的、可靠地、有序的,以字节流的方式发送数据。java实现TCP通信依靠2个类:客户端的Socket类和服务器端的ServerSocket类。

基于TCP通信的Socket模型如下:


Socket通信的实现步骤如下:

1. 创建服务器端Socket:ServerSocket和客户端Socket:Socket;
2. 打开连接到Socket的InputStream/OutputStream;
3. 按照协议对Socket进行读写操作;
4. 关闭InputStream和OutputStream和Socket。

下面是一个例子:实现功能是,客户端向服务端发送一个User类实体对象,服务端每接收到一个请求便开启一个处理线程将用户信息打印出来,并向客户端发送“欢迎登录”。
1)工程结构

2)服务端和客户端信息交流类:User
为了能实现传输。客户端和服务端的User类的包结构要一样,该类必须要序列化
User类
package com.model;
import java.io.Serializable; public class User implements Serializable {
private int id;
private String name;
private String password; public User(int id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password+ "]";
} }
3)服务端
simpleServer类,主要是用于接受请求并开起处理线程
package simpleSocketServer; import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; public class simpleServer { public static void main(String[] args){
try {
ServerSocket serverSocket = new ServerSocket(9999);
int count = 0;// 记录客户端的数量
System.out.println("服务器启动,等待客户端的连接。。。");
Socket socket = null;
while(true){
socket=serverSocket.accept();
++count;
Thread serverHandleThread=new Thread(new ServerHandleThread(socket));
serverHandleThread.setPriority(4);
serverHandleThread.start();
System.out.println("上线的客户端有" + count + "个!");
InetAddress inetAddress = socket.getInetAddress();
System.out.println("当前客户端的IP地址是:"+inetAddress.getHostAddress());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ServerHandleThread,服务器对socket进行处理的线程
package simpleSocketServer; import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; import com.model.User; public class ServerHandleThread implements Runnable{
Socket socket=null; public ServerHandleThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
OutputStream os = null;
PrintWriter pw = null;
try {
InputStream is = socket.getInputStream();
ObjectInputStream ois=new ObjectInputStream(is);
//readObject()方法必须保证服务端和客户端的User包名一致,要不然会出现找不到类的错误
System.out.println("客户端发送的对象:" + (User) ois.readObject());
socket.shutdownInput();// 禁用套接字的输入流
os=socket.getOutputStream();
pw=new PrintWriter(os);
pw.println("欢迎登录!");
pw.flush();
socket.shutdownOutput(); } catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try{
if(pw!=null){
pw.close();
}
if(os!=null){
os.close();
}
if(socket!=null){
socket.close();
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} }
4)客户端
package simpleSocketClient; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.file.attribute.UserPrincipalNotFoundException; import javax.sound.midi.MidiDevice.Info; import com.model.User; /**
* 基于TCP协议的Socket通信,实现用户登录-客户端
*/
public class Client { public static void main(String[] args) {
// 1.创建客户端的Socket,指定服务器的IP和端口
try {
Socket socket = new Socket("127.0.0.1", 9999); // 2.获取该Socket的输出流,用来向服务器发送信息
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(new User(1, "root", "123456"));
socket.shutdownOutput();
String infoString=null; // 3.获取输入流,取得服务器的信息
InputStream is = socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println("服务器端的信息:" + info);
}
socket.shutdownInput();
oos.close();
os.close();
is.close();
br.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


java socket之传输实体类对象的更多相关文章
- java 获取实体类对象属性值的方法
在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...
- java socket通信-传输文件图片--传输图片
ClientTcpSend.java client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- NSDictionary转化为实体类对象
方法一: 使用objective-c NSObject自带的方法 setValuesForKeysWithDictionary:dict 作用是: 如果NSDictionary中的key和实体类对象的 ...
- JAVA之等号、传类对象参数与c++的区别
在JAVA中用等号对类对象进行赋值,实际上操作的是对象的地址. eg: package MyText; class ClassA { int value; public void seta(int v ...
- java中循环遍历实体类的属性和数据类型以及属性值
package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTarg ...
- @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法
JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...
- Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态
Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...
随机推荐
- maven 打 fat包(jar包有了全部依赖)插件
<plugin> <artifactId> maven-assembly-plugin </artifactId> <configuration> &l ...
- DES对称加密
DES是对称性加密里面常见一种,全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对称性加密,加密 ...
- swift - 听云监测(Testin - Bugout) - 集成
听云的SDK集成放的太难找了,官方demo到现在也没找到.. 我找了半天没找到在哪,看下面俩链接吧, 切记:添加的三方库 以文档为主,视频里的三方库 不一定正确 iOS SDK 集成:https:// ...
- java 基础之--java动态代理
1.抽象角色:声明真实对象与代理对象的共同接口: 2.代理角色:相当于中介的作用,bridge,内部包含对真实角色的reference,在执行真实操作对象时,附加其他操作,相当于对真实角色的封装: 3 ...
- vue-router2
六,导航钩子 导航钩子函数主要是在导航跳转的时候做一些操作,比如跳转页面之前,进行判断 进而选择跳转到哪里 钩子函数根据生效范围根据其生效范围可以分为全局钩子函数,路由独享钩子函数 和 组件钩子函数. ...
- (二)创建ROS工作空间
ROS 教程中涉及的和编写的所有 ROS 代码需要有一个地方存放它,这个地方叫做工作空间.可以说,这个工作空间应该是一个大的集合.当我们要编译程序的时候,我们是对整个工作空间进行编译的. 这个工作空 ...
- JFinal Web开发学习(五)注册界面和后端验证
效果: 直接点击注册后 : 后端验证是可靠地,前端js验证是不可靠的.只需要在浏览器删除js验证代码即可突破js验证. 1.注册界面 在WebRoot下新建regist.jsp <%@ page ...
- jqPaginator分页(每次只取一页数据)
应用技术点:jqPaginator.template7.bootstrap.css 参考网址: jqPaginator:http://jqpaginator.keenwon.com/#a3 templ ...
- maven项目运行报错invalid LOC header (bad signature)
切换到项目目录pom.xml文件夹 执行以下命令: mvn test -e -X 找到出错信息 进入目录删除文件. 在ide里面重新部署项目即可.
- Android开发之对ListView的数据进行排序
这里涉及到对ListView的数据进行排序,以及ListView的数据如何清空处理.排序的方法相同,但是里面的数据集合有些区别:一种是利用pojo类取得数据:另一种是利用map来取得数据. 第一种:利 ...