2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Socket APIs सर्वे प्रणाल्याः प्रदत्ताः सन्ति भिन्न-भिन्न-प्रणालीभिः प्रदत्ताः APIs भिन्नाः सन्ति, परन्तु एते सिस्टम् APIs अधिकं जावा-मध्ये समाहिताः सन्ति ।
UDP मध्ये socket api द्वयोः वर्गयोः केन्द्रीभवति : DatagramSocket तथा DatagramPacket इति
अस्य वर्गस्य कार्यं "जालकार्डस्य संचालनाय" दूरनियन्त्रणरूपेण गणयितुं शक्यते, अर्थात् जालपत्रे पठनलेखनक्रियाः, यत् सञ्चिकावत् पठनं लेखनं च इति अवगन्तुं शक्यते
अनेकाः पद्धतयः प्रदत्ताः सन्ति- १.
अयं वर्गः UDP डाटाग्रामस्य वर्णनं करोति ।
प्रतिध्वनिः : क्लायन्ट् सर्वरं प्रति भिन्नानि अनुरोधाः प्रेषयति, सर्वरः च भिन्नानि प्रतिक्रियाः प्रत्यागच्छति । परन्तु अत्र प्रतिध्वनिः क्लायन्ट् सर्वरं प्रति यत् अनुरोधं करोति तत् एव, सर्वरः च किमपि गणनां वा व्यापारयुक्तिं वा विना प्रतिक्रियां ददाति ।
public class udpEchoServer {
public DatagramSocket socket = null;
public udpEchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
public void start() throws IOException {
System.out.println("服务器启动!!!");
while (true) {
//接受客户端请求
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
socket.receive(requestPacket);
//为了更好处理数据并方便打印,将接受的数据转化为字符串操作
String request = new String(requestPacket.getData(),0,requestPacket.getLength());
//处理客户端的请求(算术计算或者业务逻辑)
String response = this.process(request);
//将处理完的请求返还给客户端
DatagramPacket resposePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,
requestPacket.getSocketAddress());
socket.send(resposePacket);
//打印客户端的ip地址端口号和接收客户端的数据以及处理完客户端后的数据
System.out.printf("[%s:%d] req = %s,resp = %sn",requestPacket.getAddress(),requestPacket.getPort(),
request,response);
}
}
public String process(String request) {
return request;
}
public static void main(String[] args) throws IOException {
udpEchoServer udpEchoServer = new udpEchoServer(9999);
udpEchoServer.start();
}
}
DatagramPacket ऑब्जेक्ट् एकं डाटाग्रामं प्रतिनिधियति UDP डाटाग्रामः हेडर इत्यनेन पेलोड् इत्यनेन च निर्मितः भवति स्वयं प्रदत्तम्, अतः यथा भिक्षुः भिक्षां याचते, तथैव भवद्भिः भिक्षायाः कृते एकं कटोरा प्रदातव्यं, ततः प्रत्येकं परिवारः कटोरे भोजनं स्थापयति यतः डाटाग्रामस्य सारः द्विचक्रीयदत्तांशः अस्ति, अहं पेलोड्रूपेण बाइट् सरणीं प्रदत्तवान् .दत्तांशस्य संग्रहणम् ।
ग्राहकात् प्राप्तं दत्तांशं सर्वरेण संसाधितस्य अनन्तरं क्लायन्ट् प्रति प्रत्यागन्तुं भवति, अतः सर्वरेण संसाधितं दत्तांशं संग्रहीतुं DatagramPacket वस्तु निर्मातव्यं, ततः सर्वरः तत् क्लायन्ट् प्रति प्रेषयति अस्मिन् समये, DatagramPacket वस्तुनः रिक्तस्थानं प्रदातुं आवश्यकता नास्ति केवलं संसाधितं दत्तांशं अस्मिन् वस्तुनि स्थापयन्तु यतः दत्तांशं प्राप्य क्लायन्ट्-सङ्केतः पोर्ट्-सङ्ख्या च अभिलेखिता भवति क्लायन्ट् प्रति प्रेषयन्ते सति अभिलेखिताः भवन्ति ।
यतः सर्वरः निश्चितः अस्ति, तस्मात् भवान् प्रत्यक्षतया पोर्ट् सङ्ख्यां सेट् कर्तुं शक्नोति यदा सर्वरः आरभ्यते तदा पोर्ट् सङ्ख्या निर्मीयते ।
मम किमर्थं पोर्ट् सङ्ख्या IP-सङ्केतः आवश्यकः ?
पक्षद्वयस्य मध्ये सफलसञ्चारं प्राप्तुं एते चत्वारः मूलसूचकाः अवश्यमेव उपस्थिताः भवेयुः : १.
स्रोत-पोर्ट्, स्रोत-IP, गन्तव्य-पोर्ट्, गन्तव्य-IP
एतेषां चतुर्णां मूलसूचकानाम् माध्यमेन द्वयोः पक्षयोः मध्ये संजालसञ्चारः प्राप्तुं शक्यते यतः क्लायन्ट् सर्वरः च एकस्मिन् होस्ट् मध्ये स्तः । वयं 172.0.0.1 इत्यस्य प्रतिनिधित्वार्थं IP इत्यस्य उपयोगं कर्तुं शक्नुमः, यत् loopback IP इति अपि ज्ञायते ।
public class udpEchoClient {
private DatagramSocket socket = null;
private String serverIp;
private int serverProt;
public udpEchoClient(String serverIp, int serverProt) throws SocketException {
socket = new DatagramSocket();
this.serverIp = serverIp;
this.serverProt = serverProt;
}
public void start() throws IOException {
System.out.println("客户端启动!");
//1.从控制台获取字符串
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.println("请输入要发送的请求: ");
String request = scanner.nextLine();
//2.将输入的字符串发送给服务器,还要将发送的目标确定,IP和端口号
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), 0, request.getBytes().length,
InetAddress.getByName(serverIp), serverProt);
socket.send(requestPacket);
//3.从服务器读取到经过处理的响应
DatagramPacket responsePackt = new DatagramPacket(new byte[4096], 4096);
socket.receive(responsePackt);
//将响应打印在控制台
String response = new String(responsePackt.getData(), 0, responsePackt.getLength());
System.out.println(response);
}
}
public static void main(String[] args) throws IOException {
udpEchoClient udpEchoClient = new udpEchoClient("127.0.0.1",9999);
udpEchoClient.start();
}
}
कन्सोल् तः प्राप्तस्य स्ट्रिंग् कृते requestPacket ऑब्जेक्ट् स्ट्रिंग् ऑब्जेक्ट् इत्यस्य सन्दर्भं दीर्घतां च प्राप्नोति, तथैव स्वस्य IP तथा Prot च प्राप्नोति, ततः सॉकेट् इत्यस्य send मेथड् इत्यनेन सर्वरं प्रति प्रेषयति
सर्वरतः प्रतिक्रियां प्राप्तुं भवद्भिः responsePackt ऑब्जेक्ट् निर्माय सर्वरतः प्राप्तं प्रतिक्रियां प्राप्तुं पूर्वमेव रिक्तं बाइट् एरे निर्मातव्यम् ।
केचन पद्धतयः भेदयन्तु : १.
विधिभेदात् पूर्वं बाइट्, वर्ण, एन्कोडिंग् फॉर्म इत्यादीनां अवधारणाः अवगन्तुं आवश्यकम्
बाइट्, वर्णाः च मूलतः द्विचक्रीयाः सन्ति, यत् 0101 इव दत्तांशः अस्ति, यतः सङ्गणकः केवलं 0101 इत्येतत् परिचिनोति ।
बाइट् : बाइट् दत्तांशसञ्चयस्य मूलभूतं एककं भवति १ बाइट् ८ बिट् भवति, यस्य अर्थः अस्ति यत् एकः बाइट् २५६ भिन्नानि मूल्यानि प्रतिनिधितुं शक्नोति ।
वर्णः : वर्णः पाठसूचनायाः प्रतिनिधित्वार्थं मूलभूतः एककः अस्ति दत्तांशं दत्तांशं च संग्रहयन्तु।
एन्कोडिंग् रूपम् : १.
विधिः भिन्नाः सन्ति- १.
अत्र वयम् अस्य सर्वरस्य कार्यान्वयनार्थं उत्तराधिकारस्य बहुरूपतायाश्च विचारान् प्रयोक्तुं शक्नुमः, यतः अस्य शब्दकोशस्य अनुवादसर्वरस्य प्रतिध्वनिसर्वरस्य च मध्ये अत्यावश्यकः अन्तरः प्रतिक्रियाणां संसाधनम् अस्ति, अतः वयं पुनरावृत्तिसङ्केतं उत्तराधिकारं प्राप्य पुनः उपयोगं कर्तुं शक्नुमः तथा च आवश्यकं कोडं विस्तारयितुं शक्नुमः
public class udpDictServer extends udpEchoServer{
HashMap<String,String> map = null;
public udpDictServer(int port) throws SocketException {
super(port);
map = new HashMap<>();
map.put("server","服务");
map.put("client","客户端");
map.put("cat","🐱");
map.put("dog","🐕");
map.put("pig","🐖");
}
@Override
public String process(String request) {
return map.getOrDefault(request, "该词汇没有查询到");
}
public static void main(String[] args) throws IOException {
udpDictServer udpDictServer = new udpDictServer(9999);
udpDictServer.start();
}
}
एतत् शब्दकोशानुवादं कार्यान्वितुं भवद्भिः दत्तांशसंरचने नक्शा अपि आवश्यकं भवति, तथा च दत्तांशसङ्ग्रहार्थं मानचित्रे कील-मूल्ययुग्मानां उपयोगः भवति ।
ततः विशिष्टव्यापारसञ्चालनेषु केवलं प्रक्रियाविधिः पुनर्लेखनस्य आवश्यकता भवति ।
अत्र निष्पादनकाले यद्यपि एतत् मातापितृवर्गस्य udpEchoServer वस्तुं निर्दिशति, यतः udpDictServer उपवर्गः udpEchoServer मातापितृवर्गं उत्तराधिकारं प्राप्नोति तथा च प्रक्रियाविधिं अधिलिखति, बहुरूपीविशेषतायाः कारणेन निष्पादितः प्रक्रियाविधिः वस्तुतः उपवर्गस्य प्रक्रिया अस्ति