新官上任,转贴一篇:Java做一个最简单的通话程序

程序

Java中的网络编程是一个很重要的部分,也是其编程优越性的地方之一。在Java中有一个专门的Java.net类库来管理网络编程的有关方法。
  下面先介绍在Java中怎样用socket进行客户与服务器通信。最后再介绍一个一个最简单的通话程序。

一.怎样用socket进行客户与服务器通信
  在Java中用socket进行客户/服务器之间的通信编程。Socket是两个实体之间进行通信的有效端点。通过socket可以获得源IP地址和源端口、终点IP地址和终点端口。用户可以将多个socket连入同一个端口,以便对于单个端口可以有多个连接。通过socket客户/服务器编程可以创建一个能被许多人使用的分布式程序,并且所有客户均可以用统一的前端进行工作,并与服务器进行通信。
  要想与服务器通信必须具备三个条件:服务器程序、客户程序和连接它们的socket程序。这三个部分缺一不可。但是,客户与服务器之间的通信有很多的方式,其中另一个方法是把客户作为索取者,把服务器作为给予者。下面我们看一看Java的服务器编程。
  在Java中,服务器有3个主要的功能:
  1.在Java.net类库中通过构造一个ServerSocket类的实例使服务器能够检测到指定端口的信息。用ServerSocke中的accept()方法可以使服务器检测到指定端口的活动。另外,服务器还负责检测要求与它连接的客户。
·Socket类的实例代表客户与服务器连接成功。通过编程可以使多个用户通过同一个端口与服务器相连,其中都是Socket 类的实例。
  2.可以分别用Socket类的getInputStream()和getOutStream()方法来发送和捕捉数据。其使用方法如下:

  try{
    ServerSocket myServerSocket=new ServerSocket(100);
    Socket my100Socket=myServerSocket.accept();
  }catch(Exception e){}

  在上面的代码中,首先构造一个ServerSocket类的实例,并传递给它一个整数作为服务器指定可以使用的给定端口,如下:

  ServerSocket myServerSocket=new ServerSocket(100);

  在Java程序中如果每次构造ServerSocket时都能保持捕捉异常事件,则就随时指定了准备使用的端口。下面的代码使用accept()方法来检测端口的活动。

  Socket my100Socket=myServerSocket.accept();

  Accept()方法直到接收到用户的连接请求,才继续执行中断的执行程序。一旦客户的连接成功,my100Socket就代表该连接,并且可以发送和接收数据。
最后,我们看一看客户是怎样请求连接的。其连接方法如下:

  try{
    Socket mySocket=new Socket("www.cpcw.com",100);
  }catch(Exception e ){}

  通过上面的代码可能看出,也是通过Socket类来实现的。下面我们通过一个网络编程的实例来说明如何进行网络通信。

二.一个最简单的通话程序

通话器服务器:
import java.net.*;
import java.io.*;
import java.lang.*;

public class myserver{
public static void main(String args[]){
ServerSocket server;
Socket socket;
String s;
InputStream Is;
OutputStream Os;
DataInputStream DIS;
PrintStream PS;

try{
//在端口4321注册服务
server=new ServerSocket(4321);
socket=server.accept();   //监听窗口,等待连接

System.out.println("server ok");
System.out.println("************************************************");
System.out.println("");

//获得对应Socket的输入/输出流
Is=socket.getInputStream();
Os=socket.getOutputStream();
//建立数据流
DIS=new DataInputStream(Is);
PS=new PrintStream(Os);
DataInputStream in=new DataInputStream(System.in);
while(true){
System.out.println("");
System.out.println("please wait client's message...");
System.out.println("");
s=DIS.readLine(); //读入从client传来的字符串
System.out.println("client said:"+s); //打印字符串
if(s.trim().equals("BYE"))break; //如果是"BYE",就退出
System.out.print("you say:");
s=in.readLine(); //读取用户输入的字符串
PS.println(s); //将读取得字符串传给client
if(s.trim().equals("BYE"))break; //如果是"BYE",就退出

}

//关闭连接
DIS.close(); //关闭数据输入流
PS.close(); //关闭数据输出流
Is.close(); //关闭输入流
Os.close(); //关闭输出流
socket.close(); //关闭sockey
}
catch(Exception e){
System.out.println("Error:"+e);
}
}
}

通话器客户端
import java.net.*;
import java.io.*;
import java.lang.*;

public class myclient{
public static void main(String args[]){
if (args.length<1){ //判断命令加参数没有
System.out.println("you forget the name of the server!");
System.out.println("see also: myclient yxf");
System.exit(1); //如果没加参数就退出
}

Socket socket;
String s="yxfsoft@263.net";
String len;
InputStream Is;
OutputStream Os;
DataInputStream DIS;
PrintStream PS;
try{
//向主机名为args[0]的服务器申请连接
//注意端口号要与服务器保持一致:4321
socket=new Socket(args[0],4321);

System.out.println("client ok");
System.out.println("************************************************");
System.out.println("");

//获得对应socket的输入/输出流
Is=socket.getInputStream();
Os=socket.getOutputStream();
//建立数据流
DIS=new DataInputStream(Is);
PS=new PrintStream(Os);
DataInputStream in=new DataInputStream(System.in);

while(true){
System.out.print("you say:");
s=in.readLine(); //读取用户输入的字符串
PS.println(s); //将读取得字符串传给server
if(s.trim().equals("BYE"))break; //如果是"BYE",就退出
else
{
System.out.println("");
System.out.println("please wait server's message...");
System.out.println("");
}
s=DIS.readLine(); //从服务器获得字符串
System.out.println("server said:"+s); //打印字符串
if(s.trim().equals("BYE"))break; //如果是"BYE",就退出

}

//关闭连接
DIS.close(); //关闭数据输入流
PS.close(); //关闭数据输出流
Is.close(); //关闭输入流
Os.close(); //关闭输出流
socket.close(); //关闭socket
}
catch(Exception e){
System.out.println("Error:"+e);
}
}
}

  下载源文件:客户端工程,服务器工程。编程环境为VisualJ++6.0。
  请读者先在一台机器上运行myserver.exe(myserver.exe在服务器工程内),然后在同一台机器或与第一台机器连了网的机器上打开控制台(Dos窗口),然后转到myclient.exe(myclient.exe在客户端工程内)所在的目录,如下运行客户端程序: myclient serverhostName 或 myclient serverhostIp ,serverhostName为运行服务器程序的机器名, serverhostIp为运行服务器程序的机器的IP地址。运行后就可以相互通话了。这个通话程序只能轮换着说话,读者可以在它的基础上丰富其功能。

原作者:小锋

时间: 2024-10-26 10:55:01

新官上任,转贴一篇:Java做一个最简单的通话程序的相关文章

谷歌中国刘允新官上任三把火:加大销售团队

马晓芳 跟李开复的明星效应相比,刚刚开始全面负责谷歌大中华区销售与运营业务的全球副总裁.大中华区业务总经理刘允显然并不想成为谷歌中国的第二位"明星". "作为职业经理人,任务就是接受一项使命,带领一个团队,达到一个目标."刘允表示.任何问及刘允个人感受的问题都被他转移到谷歌的命题之上,与李开复突出个人形象的做法不同,刘允看上去更希望在谷歌品牌中淡化个人色彩. 加入谷歌之前,刘允担任SK电讯中国区首席执行官的时间长达6年,并于2008年1月加入谷歌,担任谷歌全球副总裁

新官上任三把火,Zynga CEO方言三个月做出改变

zynga-mark-and-don 三周前,我们报道了Zynga的马克·平克斯退位,并且从Xbox请来了唐·马特里克担任Zynga的CEO.唐·马特里克就位后,把自己的桌子放在了FarmVille工作室这一层的正中间,存在感十足.新官上任三把火,唐·马特里克到底准备如何做出改变?今天,他在和投资者的电话会议中给出了未来三个月的一些计划和方向. 在电话会议中,他说:"我会花时间埋头和我的团队一起把重心放在提升我们的产品质量.我想要看到我们如何在各个层级中分派人员,我还将用接下来的90天评估和重新

java源码-用JAVA做一个登录窗体

问题描述 用JAVA做一个登录窗体 有用户名,密码 :确定,重置按钮:并可以打开一个新的页面,为学生管理系统,里面有文件,新建,打开,保存,退出等按钮. 解决方案 这就是一个简单的java web的一个登陆模块, 参考demo源码链接:http://download.csdn.net/detail/bohong123456/6690373 解决方案二: 是做可视化界面那种吗?可以使用windowbuilder插件http://blog.csdn.net/jason0539/article/det

java代码-用java做一个满天星星

问题描述 用java做一个满天星星 这做完之后,怎么使星星?不断循环下落或者这么使它眨眼,我是一个初学者,想请求有大神赐教 解决方案 效果图是什么样子的,有个效果图好做些 解决方案二: 主线程控制星星的下落,再开一个线程控制眨眼, 解决方案三: Animation这个应该可以的...................

用java做一个文本编辑器并提供eclipse的编译和运行功能

问题描述 用java做一个文本编辑器并提供eclipse的编译和运行功能 实现如下主要菜单:文件(新建,打开文件,保存,另存为,退出)工具(编译,运行)帮助(关于javaedit)功能要求:1编译和运行结果要能显示在图形界面的组件中:2如果文件没有保存,关闭窗口需要提示保存:3如果文件没有命名,保存需要提示保存:4编译没有保存的java文件,需要先保存再编译:5编写代码获得编译和运行结果,不能直接用console窗口显示.(代码后给下注释) 解决方案 如果你需要简单的,自己可以动手做一下,界面使

java-怎么用Java做一个成绩管理系统?

问题描述 怎么用Java做一个成绩管理系统? Java实验课要做关于学生成绩管理系统的程序 之前学的比较浅 不知道从哪入手 希望大家能提供一些思路 题目如下: 数据库管理系统是一种常见的数据管理软件,数据库是按一定模式存储相关数据的集合.现将学生的成绩存储在education_management.mdb数据库的score表中,请编写一个数据库程序,实现录入学生成绩.自动计算成绩和学分.查询学生成绩的功能.score表中数据如下: 学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综

求助各位高手,请问怎样用java实现一个基于正则表达式的查找程序呢?

问题描述 求助各位高手,请问怎样用java实现一个基于正则表达式的查找程序呢?谢谢! 解决方案 解决方案二:你想查找什么呀?问题说清楚一些解决方案三:publicstaticString[]getStrExpression(Stringregex,Stringstr){List<String>temp=newArrayList<String>();Patternp=Pattern.compile(regex);Matcherm=p.matcher(str);while(m.find

java 我执行一个非常简单的socket程序都出错!java.net.ConnectException: Connection refused:

问题描述 java  网络编程 我执行一个非常简单的socket程序都出错!要崩溃了!我关闭了防火墙也不行,试了Ping 127.0.0.1是可以的,而且我查了这个端口也没有被占用,怎么解决?java.net.ConnectException: Connection refused: connectat java.net.DualStackPlainSocketImpl.connect0(Native Method)at java.net.DualStackPlainSocketImpl.soc

请问怎样用java实现一个基于正则表达式的查找程序呢?

问题描述 各位高手,请问怎样用java实现一个基于正则表达式的查找程序呢? 解决方案 解决方案二:可以去看看horstmann写得corejavaVolumI第12章最后一节RegularExpressions:importjava.io.*;importjava.net.*;importjava.util.regex.*;/**ThisprogramdisplaysallURLsinawebpagebymatchingaregularexpressionthatdescribesthe<ahr