您的位置:首页 > 理论基础 > 计算机网络

java基于TCP的socket编程简单实现[代码实践过]

2009-07-01 16:58 1141 查看
1.什么是socket

  所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

  以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器
端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来
说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过
SocketImpl类及其子类完成的。

  重要的Socket API:

  java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。

  . Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

  . getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。

  . getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

  注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

  2.如何开发一个Server-Client模型的程序

  开发原理:

  服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

  客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

多个客户同时连接:


主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。

现在实现服务器端编程:(基于TCP方式)

MyServer .java

---------------------------------------------------

package server;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Date;

//这个简单的socket服务器端主要是说句Hello XXX,采用多线程实现

public class MyServer extends Thread {

private Socket s;

public static void main(String[] args) {

MyServer.server();//main入口,一运行机器,就开通server服务。

}

public MyServer(Socket s) {

this.s = s;

}

public void run() {

try {

OutputStream os = s.getOutputStream();

InputStream is=s.getInputStream();

byte[] bu=new byte[20];

int len=is.read(bu);//从客户端读取消息

String userName=new String(bu,0,len);

Date d=new Date();

System.out.println(userName+" is coming here at "+d.toLocaleString());//写在服务器端控制台的日志显示

String welcome="hello,"+userName+"!";

//System.out.println(welcome);

os.write(welcome.getBytes());//返回给客户端的欢迎信息

os.close();

is.close();

s.close();

} catch (Exception e) {

e.printStackTrace();

}

}

public static void server() {

try {

ServerSocket ss = new ServerSocket(9527); //服务器的套接字,端口为9527

while (true) {

Socket s = ss.accept();

new MyServer(s).start(); //用户一进来就运行一个线程

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

客户端编程:

MyClient .java

---------------------------------

package client;

import java.io.*;

import java.net.*;

public class MyClient {

public static void main(String[] args) {

//这里先强迫用户输入用户名,调用client(str)方法。

String str = "";

try {

while (str.length() < 1) {

System.out.println("请输入您的名字");

str = new DataInputStream(new BufferedInputStream(System.in))

.readLine();

}

} catch (Exception e) {

e.printStackTrace();

}

MyClient.client(str);

}

public static void client(String userName) {

try {

Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 9527);//套接字的IP地址和端口号

OutputStream os = s.getOutputStream();

InputStream is = s.getInputStream();

byte[] Name = userName.getBytes("ISO-8859-1"); //这个是为了中文乱码问题

os.write(Name);//向服务器发送消息

byte[] serverSay = new byte[100];

int len = is.read(serverSay);//接受服务器消息

System.out.println(new String(serverSay, 0, len));//客户端控制台显示服务器返回的信息

is.close();

os.close();

s.close();//记住一定要关闭这些输入,输出流和套接字

} catch (Exception e) {

e.printStackTrace();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: