Java中使用Socket發(fā)送Java對象實例
以前寫聊天程序都是用字符串加個標志就直接發(fā)送到服務(wù)器,然后轉(zhuǎn)發(fā)了。
現(xiàn)在要求我用對象流直接發(fā)送對象,測試了一下,記錄一下。
其實我更傾向用json發(fā)送對象的,json說白了也是字符串,等有空了好好研究研究。
主要功能:客戶端給服務(wù)器發(fā)送個對象,服務(wù)器接收到了打印出來。反過來是差不多了,就不寫了。

上面是整體架構(gòu)。
User類就兩個屬性。
package com.qiantu.bean;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
服務(wù)器端:接收客戶端發(fā)送過來的user對象:
package test;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import com.qiantu.bean.User;
public class TestServer {
public void start() {
try {
ServerSocket ss = new ServerSocket(7777);
System.out.println("start to accept...");
Socket socket = ss.accept();
//建立輸入流
ObjectInputStream ois = new ObjectInputStream(
new BufferedInputStream(socket.getInputStream()));
Object obj = ois.readObject();
if (obj != null) {
User user = (User)obj;//把接收到的對象轉(zhuǎn)化為user
System.out.println("user: " + user.getName());
System.out.println("password: " + user.getPassword());
}
ois.close();
socket.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new TestServer().start();
}
}
客戶端:給服務(wù)器端發(fā)送user對象:
package client;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import com.qiantu.bean.User;
public class TestClient {
public static void main(String[] args) {
new TestClient().start();
}
public void start() {
try {
Socket socket = new Socket("127.0.0.1", 7777);
//建立輸入流
ObjectOutputStream oos = new ObjectOutputStream(socket
.getOutputStream());
User user = new User();
user.setName("梁國俏");
user.setPassword("123456");
//輸入對象, 一定要flush()
oos.writeObject(user);
oos.flush();
oos.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
運行結(jié)果:

要注意的地方:
《1》實體類要實現(xiàn)Serializable類,添加標識serialVersionUID。
《2》發(fā)送對象之后要flush();
《3》這個比較重要,搞了我半天不知道哪里出錯,言來是這個。
服務(wù)器端和客戶端兩邊的實體類要一模一樣,類名一樣,包名也要一樣。我就是因為包名不一樣搞了很久。。。。
相關(guān)文章
使用maven-assembly-plugin如何打包多模塊項目
這篇文章主要介紹了使用maven-assembly-plugin如何打包多模塊項目,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
mybatis初始化SqlSessionFactory失敗的幾個原因分析
這篇文章主要介紹了mybatis初始化SqlSessionFactory失敗的幾個原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java CompletableFuture如何實現(xiàn)超時功能
這篇文章主要為大家介紹了實現(xiàn)超時功能的基本思路以及CompletableFuture(之后簡稱CF)是如何通過代碼實現(xiàn)超時功能的,需要的小伙伴可以了解下2025-01-01
Java與Oracle實現(xiàn)事務(wù)(JDBC事務(wù))實例詳解
這篇文章主要介紹了Java與Oracle實現(xiàn)事務(wù)(JDBC事務(wù))實例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
Spring Boot中的 6 種API請求參數(shù)讀取方式示例詳解
使用Spring Boot開發(fā)API的時候,讀取請求參數(shù)是服務(wù)端編碼中最基本的一項操作,Spring Boot中也提供了多種機制來滿足不同的API設(shè)計要求,這篇文章主要介紹了Spring Boot中的 6 種API請求參數(shù)讀取方式示例詳解,需要的朋友可以參考下2024-05-05
Java 數(shù)據(jù)流之Broadcast State
這篇文章主要介紹了Java 數(shù)據(jù)流之Broadcast State,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09

