ไลบรารีที่มีน้ำหนักเบาและใช้งานง่ายมากสำหรับแอพพลิเคชั่นไคลเอนต์-เซิร์ฟเวอร์หรือแอพพลิเคชั่นเซิร์ฟเวอร์ลูกค้าใน Java ที่ทำงานทั้งหมดสำหรับคุณ: การตั้งค่าการเชื่อมต่อการเชื่อมต่อการเชื่อมต่อการหมดเวลาการเก็บรักษา ฯลฯ ในพื้นหลัง เพียงแค่บอกแอปพลิเคชันว่าจะส่งและรับอย่างไรและส่วนที่เหลือจะเกิดขึ้นด้วยตัวเอง เกือบจะเวทมนตร์!
คุณภาพรหัสและสถานะการสร้าง
import java . net . Socket ;
public class MyServer extends Server {
public MyServer ( int port ) {
super ( port );
}
@ Override
public void preStart () {
registerMethod ( "SOME_MESSAGE" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
doSomethingWith ( msg );
sendReply ( socket , "Hey, thanks for your message. Greetings!" )
}
});
}
}เพียงแค่สร้างคลาสของคุณเองเช่น MyServer Extending Server เพียงใช้ตัวสร้างดั้งเดิมและใช้วิธี Prestart () ในวิธี Prestart เพียงเพิ่ม
registerMethod ( "IDENTIFIER" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
doSomethingWith ( msg , socket );
sendReply ( socket , "Some Reply" );
}
});สำหรับตัวระบุทุกข้อมูลของเซิร์ฟเวอร์ที่ได้รับคุณต้องการตอบสนอง
ตัวอย่าง: ดังนั้นหากคุณลงทะเบียน "ping" และการตอบสนอง "pong" ที่เรียกใช้งานได้กับลูกค้าเพียงลงทะเบียน
registerMethod ( "PING" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
sendReply ( socket , "Pong" );
}
});และนั่นคือ
สำหรับตัวระบุเพิ่มเติมที่จะตอบสนองเพียงแค่ใส่บรรทัดเหล่านั้นหลายครั้งใน prestart ของคุณ () อย่าลืมส่งการตอบกลับไปยังลูกค้าที่คุณได้รับจาก DataPackge เพราะพวกเขาจะรอจนกว่าโลกจะสิ้นสุดการตอบกลับจากคุณ
ตัวอย่างสำหรับเซิร์ฟเวอร์ออกอากาศข้อความแชทไปยังไคลเอนต์ที่เชื่อมต่อทั้งหมด:
registerMethod ( "Message" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
System . out . println ( "[Message] New chat message arrived, delivering to all the clients..." );
broadcastMessage ( msg ); //The broadcast to all the receivers
sendReply ( socket , String . valueOf ( reveicerCount )); //The reply (NECESSARY! unless you want the client to block while waiting for this package)
}
}); import java . net . Socket ;
public class MyClient extends Client {
public MyClient ( String id , String address , int port ) {
super ( id , address , port );
registerMethod ( "SOME_MESSAGE" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
System . out . println ( "Look! I got a new message from the server: " + msg . get ( 1 ));
}
});
start (); // Do not forget to start the client!
}
}เพียงทำคลาสของคุณเองเช่นไคลเอนต์ขยาย MyClient เพียงใช้ตัวสร้างดั้งเดิม เมื่อใดก็ตามที่คุณพร้อมสำหรับลูกค้าในการเข้าสู่ระบบโทรเริ่มต้น () ไคลเอนต์จะเชื่อมต่อกับเซิร์ฟเวอร์ขึ้นอยู่กับตัวสร้างพารามิเตอร์และลงทะเบียนตัวเองบนเซิร์ฟเวอร์ จากนี้ไปมันสามารถรับข้อความจากเซิร์ฟเวอร์และเชื่อมต่ออยู่ (และเชื่อมต่ออีกครั้งหากจำเป็น) จนกว่าคุณจะโทรหยุด ()
หากต้องการตอบสนองต่อข้อความที่เข้ามาเพียงเพิ่ม
registerMethod ( "IDENTIFIER" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
doSomethingWith ( msg , socket );
}
});ที่ไหนสักแห่งฉันแนะนำตัวสร้างเองสำหรับทุกรหัสข้อความที่คุณต้องการจัดการ
ExpaPle สำหรับข้อความแชทที่เข้ามาจากเซิร์ฟเวอร์:
registerMethod ( "PING" , new Executable () {
@ Override
public void run ( Datapackage msg , Socket socket ) {
System . out . println ( "Look! I got a new message from the server: " + msg . get ( 1 ));
// msg.get(1); should now return "Pong" in our example.
}
});แตกต่างจากไคลเอนต์เซิร์ฟเวอร์จะไม่คาดหวังการตอบกลับตามค่าเริ่มต้น ดังนั้นอย่าส่งแพคเกจตอบกลับมาให้เขาเสมอเพราะเขาต้องการวิธีการพิเศษที่ลงทะเบียนไว้สำหรับสิ่งนั้น
เป็นเซิร์ฟเวอร์:
ในฐานะลูกค้า:
มีตัวจัดการเหตุการณ์บางอย่าง (เช่น onconnectiongood (), onconnectionProblem (), onlientregistered (... ) ฯลฯ ) คุณสามารถเขียนทับเพื่อจัดการกับเหตุการณ์เหล่านี้
คลาสไคลเอนต์และเซิร์ฟเวอร์ทั้งสองให้ตัวจัดการเหตุการณ์ onlog และ onlogerror ซึ่งสามารถแทนที่ในการใช้งานหากข้อความข้อมูลและข้อความแสดงข้อผิดพลาดไม่ควร (เท่านั้น) จะถูกส่งออกในคอนโซล