JAVA套接字编程分析

JAVA套接字编程分析
JAVA套接字编程分析

JAVA 套接字(Socket)编程分析

班级:11计科6班 姓名:叶创建 学号:201141402601

一、TCP 套接字编程

功能:服务端启动后,客户端往服务端发送小写字母,服务端返回大写字母。

程序框图:

new SocketServer(); 创建套接字服务

服务端

accept();获得Socke 对象,并监听客户端

new BufferedReader()获得输入流

toUpperCase()转换为大写字母

new Socket(); 创建套接字对象

客户端

new PrintWriter()创建输出流,输出大写字母 创建输出流new OutputStreamWriter(),从键盘录入字母

建立连接

new BufferedReader) 获得输入流,打印字母

close()关闭套接字

close()关闭套接字

if 客户端发送OVER

if 客户端发送OVER

TCP服务端程序代码:

class TransServer

{

public static void main(String[] args) throws Exception

{

ServerSocket ssk = new ServerSocket(10001);//创建Socket服务

Socket sk = ssk.accept();//获取客户端Socket对象

String ip = sk.getInetAddress().getHostAddress();//获取客户端IP

System.out.println(ip+"is connected...");

BufferedReader bufIn=

new BufferedReader(new

InputStreamReader(sk.getInputStream()));//获得输入流对象

PrintWriter out = new

PrintWriter(sk.getOutputStream(),true);//获得输出流对象

String line =null;

while((line=bufIn.readLine())!=null)

{

System.out.println(line);

out.println(line.toUpperCase());//转换成小写

}

sk.close();

ssk.close();

}

}TCP客户端程序代码:

class TransClient

{

public static void main(String[] args) throws Exception

{

Socket sk = new Socket("localhost",10001);

BufferedReader bufr =

new BufferedReader(new InputStreamReader(System.in));

PrintWriter out = new PrintWriter(sk.getOutputStream(),true);

BufferedReader bufIn =

new BufferedReader(new

InputStreamReader(sk.getInputStream()));

String line = null;

while((line=bufr.readLine())!=null)

{

if ("over".equals(line))//over结束对话

{

break;

}

System.out.println(line);

out.println(line);

String str = bufIn.readLine();

System.out.println("server:"+str);

}

bufr.close();

sk.close();

}

}

运行效果:

TCP套接字分析:

1.对于服务端ServerSocket ssk = new ServerSocket(10001);创建

Socket服务,接收端口为10001,这个端口必须是唯一的,范围在

0~65535之间.

2.客户端创建Socket服务,往服务端IP的10001端口发送数据;服务

端调用ssk.accept();获取客户端的Socket对象,监听的端口为10001

3.获取客户端发送的数据,即输入流.

4.把字母转换后生成输出流,传回给客户端.

5.最好关闭套接字对象.

6.其中对于输入流和输出流,这些输入IO技术,因为传送的是字母,不

是二进制文件,所以只需调用字符流对象即可.

7.服务端只有一个,而客户端有多个,每一个客户端连接服务端的时

候,服务端都会获得一个Socket对象,所以在程序池里面会有多个不同的Socket对象.

8.ssk.accept()是个阻塞方法,所以在编写程序的时候要特别注意,不

能让服务端和客户端同时在等待.

9.多个客户端连接服务端的时候需要排队,如需并发进行,需要运用

java的多线程技术.

二、UDP 套接字编程(UDP 聊天室) 程序框图:

程序代码:

import https://www.360docs.net/doc/fd8639758.html,.*; import java.io.*;

class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds) { this.ds = ds ; } public void run() { try { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

String line;

new

DatagramSocket(8085)创建套接字

发送端

new DatagramPacket() 对数据进行打包,指定目的地IP 和端口

ds.send(dp);发送包 new DatagramSocket()创建套接字

接收端

new DatagramPacket() 创建包对象,指定监听端口

ds.receive(dp);接受发送端数据

close()关闭套接字

close()关闭套接字

if 客户端发送OVER

while((line=bufr.readLine())!=null )

{

byte[] buf = line.getBytes();

DatagramPacket dp =

new

DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),81);

ds.send(dp);

if("886".equals(line))

break;

}

}

catch (Exception e )

{

throw new RuntimeException("发送端失败");

}

}

}

class Rece implements Runnable

{

private DatagramSocket ds;

public Rece(DatagramSocket ds)

{

this.ds=ds;

}

public void run()

{

try

{

while(true)

{

byte[] buf = new byte[1024];

DatagramPacket dp = new DatagramPacket(buf,buf.length);

ds.receive(dp);

String ip = dp.getAddress().getHostAddress();

int port = dp.getPort();

String data = new String(dp.getData(),0 ,dp.getLength());

System.out.println(ip+":"+port+"-->>"+data);

}

}

catch (Exception e )

{

throw new RuntimeException("发送端失败");

}

}

}

class ChatDemo

{

public static void main(String[] args) throws Exception

{

new Thread(new Send(new DatagramSocket(8085))).start();

new Thread(new Rece(new DatagramSocket(81))).start();

}

}

运行效果

UDP套接字分析:

1.DatagramSocket()是java中创建UDP的Socket对象的

构造方法,发送方调用该方法,指定程序的端口,用于识别程序.调用DatagramPacket()对数据进行打包,指定目的地IP地址和接收端口,最后调用send()方法把包发送出去.

2.接收方调用DatagramSocket(81)方法指定监听的端口,

调用DatagramPacket()创建包,再调用ds.receive(dp)接收81端口发送过来的包.其中dp.getData()方法是获得包里面的数据,再打印在控制台上.

3.发送端和接收端都用了while循环,不断接不断收.再

调用java 的多线程技术使两个程序能过并发进行.

4.该UDP聊天室只能在本地进行收发,如果需要改成局域

网的聊天室,则只需要把发送端程序的目的IP改为广播地址,广播地址一般为网段后在最后一个IP.

相关主题
相关文档
最新文档