- 论坛徽章:
- 0
|
作为一个C的程序员,如何理解java的socket编程? 我们可以对比一下[转载请注明本CU Blog地址,谢谢]。当然要注意的是,Java中socket编程的一个限制: Java的Socket的只能支持TCP/IP的协议族,其他的协议族没有Java的原生支持。这个是跨平台和通用性的代价。
(1)C语言进行socket编程,socket()函数是个无敌的函数:它可以完成一切你需要得到的套接字初始话信息,
socket(PF_INET,SOCK_STREAM,0);//返回一个tcp连接资源
socket(PF_INET,SOCK_DGRAM,0);//返回一个udp连接资源
显然Java决不会这么做。OOP的思想是一个类完成一件事情
new Socket("IP地址“,端口);//创建tcp资源对象
new DatagramSocket();类创建udp资源
(2)如何创建一个服务器端?
C语言: socket创建以后,填充一个sockaddr_in结构,然后bind()绑定一个/多个IP地址,然后listen处于监听状态,然后accept得到连接
Java: 所有的创建信息都在ServerSocket构造函数中,返回一个监听对象ss,然后
Socket=ss.accept();//得到和客户端相连接的socket对象。
是不是Java的过程看起来比C更简洁?
下面用例子程序来说明Java的socket包如何构建最简单的客户端/服务器端连接。
(a)>cat client.java
import java.io.*;
import java.net.*;
public class client{
public client(){
try{
System.out.println("ctor");
Socket s=new Socket("127.0.0.1",10080);//连接本地服务器的10080端口
BufferedReader buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
System.out.println(buf.readLine());
out.println("got it!");
buf.close();
out.close();
s.close();
}catch(IOException e){}
}
public void f(){}
public static void main(String args[]){
new client().f();
}
}
(b)>cat server.java
import java.io.*;
import java.net.*;
public class server{
public server(){
ServerSocket ss;
Socket s;
BufferedReader r;
PrintWriter w;
try{
ss=new ServerSocket(10080);
while(true){
s=ss.accept();
System.out.println("accepted");
r=new BufferedReader(new InputStreamReader(s.getInputStream()));
w=new PrintWriter(s.getOutputStream());
w.println("221-Bye K.G\r\n");
w.flush();//注意,如果这里不刷新输出,输出可能被一直阻塞
System.out.println(r.readLine());
r.close();
w.close();
s.close();
}//while
}catch(IOException e){}
}
public static void main(String args[]){
new server();
}
}
当然,上面这个服务器端必须处理了一个连接以后,再处理下一个连接。新的连接总是被阻塞。为了达到并发的效果,我们可以采用Thread类型来处理每个客户端连接。C编程通常采用多进程的fork方式。
>cat server2.java
import java.io.*;
import java.net.*;
public class server2{
public server2(){
ServerSocket ss;
Socket s;
try{
ss=new ServerSocket(10080);
while(true){
s=ss.accept();
System.out.println("accepted");
new servThread(s);
}//while
}catch(IOException e){}
}
class servThread extends Thread{
BufferedReader r;
PrintWriter w;
Socket s;
public servThread(Socket is){
try{
s=is;
r=new BufferedReader(new InputStreamReader(s.getInputStream()));
w=new PrintWriter(s.getOutputStream());
w.println("Welcome\r\n");
start();
}catch(IOException e){}
}
public void run(){
try{
w.flush();
System.out.println(r.readLine());
r.close();
w.close();
s.close();
}catch(IOException e){}
}
}
public static void main(String args[]){
new server2();
}
}
编译输出4个class文件
>ls *.class
client.class server2.class server2$servThread.class server.clas
>java server2 #启动服务器端
>java client #启动客户端,打印IO信息并退出
>java client #再启动一个客户端,服务器端的控制终端有了持续的输出信息。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/88035/showart_1885020.html |
|