ในอดีตฉันเขียนโปรแกรมแชทและส่งสัญญาณไปยังเซิร์ฟเวอร์โดยตรงด้วยสตริงแล้วส่งต่อ
ตอนนี้ฉันขอให้ฉันส่งวัตถุโดยตรงด้วยการไหลของวัตถุทดสอบและบันทึก
ในความเป็นจริงฉันมีแนวโน้มที่จะส่งวัตถุกับ JSON มากขึ้น
ฟังก์ชั่นหลัก: ไคลเอนต์ส่งวัตถุไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์ได้รับ วิธีอื่นเกือบจะเหมือนกันดังนั้นฉันจะไม่เขียนมัน
ข้างต้นเป็นสถาปัตยกรรมโดยรวม
คลาสผู้ใช้เป็นสองแอตทริบิวต์
คัดลอกรหัสรหัสดังนี้:
แพ็คเกจ com.qiantu.bean;
นำเข้า java.io.serializable;
ผู้ใช้ระดับสาธารณะใช้ serializable {
ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L;
ชื่อสตริงส่วนตัว;
รหัสผ่านสตริงส่วนตัว
สตริงสาธารณะ getName () {
ชื่อคืน;
-
โมฆะสาธารณะ setName (ชื่อสตริง) {
this.name = ชื่อ;
-
สตริงสาธารณะ getPassword () {
ส่งคืนรหัสผ่าน;
-
โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {{
this.password = รหัสผ่าน;
-
-
ด้านเซิร์ฟเวอร์: วัตถุผู้ใช้ที่ส่งโดยไคลเอนต์:
คัดลอกรหัสรหัสดังนี้:
การทดสอบแพ็คเกจ;
นำเข้า Java.io.BuffredInputStream;
นำเข้า java.io.ioException;
นำเข้า Java.io.ObjectInputStream;
นำเข้า java.net.serversocket;
นำเข้า java.net.socket;
นำเข้า com.qiantu.bean.user;
Testserver ระดับสาธารณะ {
Public Void Start () {
พยายาม {
Serversocket SS = ใหม่ Serversocket (7777);
System.out.println ("เริ่มยอมรับ ... ");
ซ็อกเก็ตซ็อกเก็ต = ss.accept ();
// สร้างสตรีมอินพุต
ObjectStream OIS = ใหม่ ObjectInputStream (
ใหม่ bufferedInputStream (socket.getInputStream ()));
Object OBJ = OIS.ReadObject ();
ถ้า (obj! = null) {
user user = (ผู้ใช้) obj;
System.out.println ("ผู้ใช้:" + user.getName ());
System.out.println ("รหัสผ่าน:" + user.getPassword ());
-
ois.close ();
Socket.close ();
ss.close ();
} catch (ioexception e) {{
E.PrintStackTrace ();
} catch (classnotFoundException e) {{
E.PrintStackTrace ();
-
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {{
Testserver ใหม่ ()
-
-
ไคลเอนต์: ส่งวัตถุผู้ใช้ไปยังเซิร์ฟเวอร์:
คัดลอกรหัสรหัสดังนี้:
ไคลเอนต์แพ็คเกจ;
นำเข้า java.io.ioException;
นำเข้า Java.io.ObjectPutStream;
นำเข้า java.net.socket;
นำเข้า java.net.unknownhostexception;
นำเข้า com.qiantu.bean.user;
TestClient คลาสสาธารณะ {
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {{
การทดสอบใหม่ ()
-
Public Void Start () {
พยายาม {
ซ็อกเก็ตซ็อกเก็ต = ซ็อกเก็ตใหม่ ("127.0.0.1", 7777);
// สร้างสตรีมอินพุต
ObjectPutStream oos = new ObjectPutStream (ซ็อกเก็ต
.getPutStream ());
ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ ();
user.setName ("Liang Guoqiao");
user.setPassword ("123456");
// ป้อนวัตถุให้แน่ใจว่าได้ล้าง ()
oos.writeObject (ผู้ใช้);
oos.flush ();
oos.close ();
Socket.close ();
} catch (unknownhostexception e) {{
E.PrintStackTrace ();
} catch (ioexception e) {{
E.PrintStackTrace ();
-
-
-
เรียกใช้ผลลัพธ์:
ให้ความสนใจกับ:
คลาสทางกายภาพ "1" ควรใช้คลาส serializable และเพิ่มการระบุ serviceVersionuid
Flush () หลังจาก "2" ส่งวัตถุ;
"3" มีความสำคัญมากกว่า
หมวดหมู่ทางกายภาพของทั้งสองด้านของเซิร์ฟเวอร์นั้นเหมือนกัน ฉันทำชื่อมานานแล้ว แก่นแท้ แก่นแท้ แก่นแท้