java

位置:IT落伍者 >> java >> 浏览文章

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


发布日期:2018年01月04日
 
Java做一个最简单的Socket通话程序

Java中的网络编程是一个很重要的部分也是其编程优越性的地方之一在Java中有一个专门的类库来管理网络编程的有关方法

下面先介绍在Java中怎样用socket进行客户与服务器通信最后再介绍一个一个最简单的通话程序

怎样用socket进行客户与服务器通信

在Java中用socket进行客户/服务器之间的通信编程Socket是两个实体之间进行通信的有效端点通过socket可以获得源IP地址和源端口终点IP地址和终点端口用户可以将多个socket连入同一个端口以便对于单个端口可以有多个连接通过socket客户/服务器编程可以创建一个能被许多人使用的分布式程序并且所有客户均可以用统一的前端进行工作并与服务器进行通信

要想与服务器通信必须具备三个条件服务器程序客户程序和连接它们的socket程序这三个部分缺一不可但是客户与服务器之间的通信有很多的方式其中另一个方法是把客户作为索取者把服务器作为给予者下面我们看一看Java的服务器编程

在Java中服务器有个主要的功能

在类库中通过构造一个ServerSocket类的实例使服务器能够检测到指定端口的信息用ServerSocke中的accept()方法可以使服务器检测到指定端口的活动另外服务器还负责检测要求与它连接的客户

·Socket类的实例代表客户与服务器连接成功通过编程可以使多个用户通过同一个端口与服务器相连其中都是Socket 类的实例

可以分别用Socket类的getInputStream()和getOutStream()方法来发送和捕捉数据其使用方法如下

try{

ServerSocket myServerSocket=new ServerSocket();

Socket mySocket=myServerSocketaccept();

}catch(Exception e){}

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

ServerSocket myServerSocket=new ServerSocket()

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

Socket mySocket=myServerSocketaccept();

Accept()方法直到接收到用户的连接请求才继续执行中断的执行程序一旦客户的连接成功mySocket就代表该连接并且可以发送和接收数据

最后我们看一看客户是怎样请求连接的其连接方法如下

try{

Socket mySocket=new Socket();

}catch(Exception e ){}

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

一个最简单的通话程序

通话器服务器:

import *;

import javaio*;

import javalang*;

public class myserver{

public static void main(String args[]){

ServerSocket server;

Socket socket;

String s;

InputStream Is;

OutputStream Os;

DataInputStream DIS;

PrintStream PS;

try{

//在端口注册服务

server=new ServerSocket();

socket=serveraccept(); //监听窗口等待连接

Systemoutprintln(server ok);

Systemoutprintln(************************************************);

Systemoutprintln();

//获得对应Socket的输入/输出流

Is=socketgetInputStream();

Os=socketgetOutputStream();

//建立数据流

DIS=new DataInputStream(Is);

PS=new PrintStream(Os);

DataInputStream in=new DataInputStream(Systemin);

while(true){

Systemoutprintln();

Systemoutprintln(please wait clients message);

Systemoutprintln();

s=DISreadLine(); //读入从client传来的字符串

Systemoutprintln(client said:+s); //打印字符串

if(strim()equals(BYE))break; //如果是BYE就退出

Systemoutprint(you say:);

s=inreadLine(); //读取用户输入的字符串

PSprintln(s); //将读取得字符串传给client

if(strim()equals(BYE))break; //如果是BYE就退出

}

//关闭连接

DISclose(); //关闭数据输入流

PSclose(); //关闭数据输出流

Isclose(); //关闭输入流

Osclose(); //关闭输出流

socketclose(); //关闭sockey

}

catch(Exception e){

Systemoutprintln(Error:+e);

}

}

}

通话器客户端

import *;

import javaio*;

import javalang*;

public class myclient{

public static void main(String args[]){

if (argslength<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="";

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);

}

}

}

               

上一篇:Java标准输出重定向到GUI

下一篇:Java套接字实现网络编程之基础篇