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

Java网络编程,Socket,ServerSocket使用,TCP,UDP的异同

2016-07-20 08:59 861 查看
工作内容:

1.网络协议,网络传输方式TCP,UDP
2.网络编程常用的InetAddress,URL类
3.套接字Socket,ServerSocket
学习分享:

一、 TCP,UDP比较

TCP

UDP

可靠,三次握手

不可靠

传输速度慢

传输速度快

响应式

发送出去不管有没有接收

基于传输层
二、InetAddress构造方法是default修饰,不能创建其对象,常用方法:getAddress(String host)返回byte数组,getByName(String
host)返回一个InetAddress,getLocalhost获取本地IP及计算机名,getHostName()获取域名

三、URL,常用构造方法URL url= new URL(“http://www.baidu.com”)

常用方法:url.openStream获取一个网站源码的流

四、Socket,ServerSocket

实例:

//多线程服务器端

public class SocketService{

static List<Socket>sockets =
new ArrayList<Socket>();

private Socketsocket =
null;

private ServerSocketserver =
null;

private int countNum=1;//记录已杀连接的客户端个数

//主函数

public static void main(String [] args){

new SocketService();

}

public SocketService() {

// 启动服务器

try {

System.out.println("服务器已启动");

server =
new
 ServerSocket(20166);

while (true) {

System.out.println("\r\n等待客第" +countNum +
"个客户连接...");

socket =
server.accept();//阻塞,直到有客户端来链接

System.out.println("\r\n客户端已连接");

System.out.println("\r\n客户端地址:" +socket.getInetAddress());

sockets.add(socket);

new Server_thread(socket).start();

countNum++;

}

}catch(Exception e){

e.printStackTrace();

}

}

}

class Server_threadextends Thread {

private Socketsocket;

private DataInputStreamdis =
null;

//private DataOutputStreamdos = null;

private Strings =
null;

private StringuserName;

private int readTimes = 1;//用于控制客户端姓名显示

private BufferedWriterbWriter =null;

private BufferedReaderbReader =
null;

public Server_thread(Socket socket) {

this.socket = socket;

}

@Override

public void run() {

while (true) {

try {

//dis = new DataInputStream(socket.getInputStream());//改成BufferedReader

bReader =new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));

//dos = new DataOutputStream(socket.getOutputStream());

//s = dis.readUTF();//改成BufferedReader

// 堵塞状态,除非收到信息

s =
bReader.readLine();

//第一次读取客户端的名称

if(readTimes ==1 ){

userName =s ;

for(Socket socket1:SocketService.sockets){

//DataOutputStreamdos1 = new DataOutputStream(socket1.getOutputStream());//改成BufferedWriter

//dos1.writeUTF("[系统消息]"+userName+"上线了");

//dos1.flush();

bWriter =new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream(),"UTF-8"));

bWriter.write("[系统消息]"+userName+"上线了"+"\n");

//bWriter.flush();

}

}else{

for(Socket socket1:SocketService.sockets){

//DataOutputStreamdos1 = new DataOutputStream(socket1.getOutputStream());

//dos1.writeUTF(userName+": "+ s);

//dos1.flush();

bWriter =new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream(),"UTF-8"));

bWriter.write(userName+": "+s+"\n");

//System.out.println("日志:"+userName+": "+ s);

bWriter.flush();

}

}

readTimes++;

} catch(SocketException ee){

//socket下线就从数组里面移除

SocketService.sockets.remove(socket);

/**

 *1.提示所有客户端XX已下线

 *2.在遍历过程中会把已下线的socket遍历出来,并向其发送信息  【导致异常①可能会向已经下线的客户端发送信息】

 *3.运行结果:如果有客户端s1下线,则会提示其他所有的客户端“s1已下线”

 */

try {

for(Socket socket1:SocketService.sockets){

//DataOutputStreamdos1 = new DataOutputStream(socket1.getOutputStream());

//dos1.writeUTF(userName+" 已下线");

//dos1.flush();

bWriter =new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream(),"UTF-8"));

bWriter.write(userName+" 已下线"+"\n");

System.out.println("日志:"+userName+"已下线");

bWriter.flush();

}

System.out.println(userName+"已下线");

return;

} catch (Exception e2) {

e2.printStackTrace();

}

return;

}catch (IOException e) {

}

}

}

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