免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2768 | 回复: 2
打印 上一主题 下一主题

Java下socket编程入门 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-30 22:19 |只看该作者 |倒序浏览

    作为一个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
血い寒峰 该用户已被删除
2 [报告]
发表于 2009-04-02 11:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2009-04-02 16:36 |只看该作者
原帖由 血い寒峰 于 2009-4-2 11:24 发表
为什么这里面没人过来呢。。?

这里是文档专区,所以基本上没有回帖的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP