`
jian0487
  • 浏览: 96137 次
  • 性别: Icon_minigender_1
  • 来自: 宁德
社区版块
存档分类
最新评论

Java做一个最简单的Socket通话程序

阅读更多

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&acute;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);
}
}
}  

 

通话器服务器: 
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&acute;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&acute;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); 
} 
} 
}  
分享到:
评论

相关推荐

    TCPSocket 和UDP通信java聊天室源文件

    本项目提供的"TCPSocket 和UDP通信java聊天室源文件"是一个很好的实践案例,用于学习如何在Java中实现这两种协议的聊天室功能。下面将详细阐述TCP与UDP的特点、Java中Socket编程的基本概念以及如何运用这些知识来...

    基于java的socekt 的echo程序

    在本文中,我们将深入探讨基于Java的TCP和UDP协议的echo程序,并解析如何使用Socket类来创建这两个协议的基础应用。 首先,TCP(传输控制协议)是一种面向连接的、可靠的传输协议,它保证了数据包的顺序和完整性。...

    tcp-udp.zip_java socket udp_java tcp udp

    在IT行业中,网络通信是至关重要的一个领域,而TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)则是两种最常使用的传输层协议。本篇将深入探讨如何在Java环境中使用Socket进行TCP和UDP的文件...

    网络编程1Socket编程

    **Socket**,也称为套接字,是网络通信中的一个抽象概念,它代表了两台机器之间的通信端点。Socket允许应用程序发送和接收数据,而无需关心底层网络协议的复杂性。在Internet上,TCP/IP协议栈是最常见的网络协议,...

    Java Socket编程详解及示例代码

    下面是一个简单的TCP服务器和客户端示例: ```java // 服务器端 ServerSocket server = new ServerSocket(8080); Socket client = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader...

    基于java一个简单的即时通讯工具开发

    在本文中,我们将深入探讨如何使用Java开发一个简单的即时通讯工具。即时通讯工具,或IM(Instant Messaging),是人们日常工作中不可或缺的一部分,它允许用户实时发送消息、进行语音或视频通话,甚至分享文件。...

    Socket的TCP、UDP通讯

    Socket编程是计算机网络编程中的重要组成部分,主要用于实现进程间的通信,包括在同一台机器上的进程间通信,也包括跨网络的进程通信。在标题和描述中提到的“Socket的TCP、UDP通讯”涵盖了两种主要的传输层协议:...

    UDP socket

    1. **创建Socket**:在Java中,创建一个UDP Socket需要实例化`DatagramSocket`类。服务器端通常先创建Socket并绑定到特定的IP地址和端口号,以便接收数据报文。 ```java DatagramSocket serverSocket = new ...

    java电话系统

    Java电话系统是一个基于J2SE(Java 2 Standard Edition)平台开发的小程序,它展示了如何利用Java编程语言来实现一个电话通信系统的核心功能。在这个项目中,开发者可能涉及了网络通信、多线程、对象交互等多个Java...

    java网络编程非常重要

    Java网络编程是开发分布式应用程序的关键技术,特别是在当前互联网时代,其重要性不言而喻。本文将深入探讨Java网络编程的基础知识,重点关注TCP和UDP两种主要的网络协议及其在Java中的实现。 首先,网络编程的核心...

    用Java实现网络语音信号传送

    例如,在Java中创建一个简单的TCP服务器通常涉及到以下步骤: 1. 创建一个`ServerSocket`实例,绑定到特定端口。 2. 调用`accept()`方法等待客户端连接请求。 3. 处理连接后,读取客户端发送的数据或向客户端发送...

    基于Java的桌面聊天室

    【Java桌面聊天室】是一个利用Java编程语言实现的本地客户端应用程序,它允许用户在桌面环境中进行实时交流。这个项目的核心是构建一个简单的聊天系统,让用户能够发送文本消息、表情符号和其他基本的沟通元素。通过...

    Java-Oracle-UDP通信

    例如,以下是一个简单的Java UDP客户端和服务器端示例: ```java // 客户端 public class UDPSender { public static void main(String[] args) throws Exception { String message = "Hello, Oracle!"; byte[] ...

    关于简单tcp和UDP 服务端实例

    在IT行业中,网络通信是至关重要的一个领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种最常使用的传输层协议。本篇文章将深入探讨这两种协议,并通过简单的服务端实例来帮助理解它们的工作原理。 首先,...

    java实现的tcpudp通信

    - **UDP**:用户数据报协议(User Datagram Protocol),是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 更适用于实时性和速度要求较高的场景,如视频直播、在线游戏等。 #### 实验原理 - ...

    网络编程的简单demo

    本篇将主要聚焦于Java语言中的网络编程,基于"网络编程的简单demo"这一主题,结合"Java笔记11号"的内容,探讨TCP和UDP这两种主要的传输协议,并通过"udp"和"socket"这两个关键词来解析相关知识点。 首先,让我们从...

    精选java网络编程面试题

    - **LT(Level Triggered,水平触发)**:只要一个文件描述符的读写状态发生变化,就会一直报告该事件,直到程序处理并清除该事件。 - **ET(Edge Triggered,边缘触发)**:只报告状态变化的边缘,即从就绪变为未...

    Java聊天室的设计与实现毕业设计.docx

    设计Java聊天室的主要目的是提供一个简单易用、安全可靠的聊天环境,促进用户的社交互动。此外,该项目的实施有助于加深对Java网络编程、多线程处理、并发控制等技术的理解,提高软件开发能力,对提升毕业生的专业...

    RUDP.zip_RUDP_java网络IP电话_winsock rudp_可靠传输_基于

    "FileServer"和"ClientApplication"则可能是实际的Java程序,它们可能展示了如何利用RUDP进行文件传输,这是可靠数据传输的一个典型应用场景。 学习和理解RUDP不仅有助于开发实时通信应用,也对深入理解网络协议和...

Global site tag (gtag.js) - Google Analytics