Java网络编程,Socket,ServerSocket使用,TCP,UDP的异同
2016-07-20 08:59
861 查看
工作内容:
1.网络协议,网络传输方式TCP,UDP
2.网络编程常用的InetAddress,URL类
3.套接字Socket,ServerSocket
学习分享:
一、 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) {
}
}
}
}
1.网络协议,网络传输方式TCP,UDP
2.网络编程常用的InetAddress,URL类
3.套接字Socket,ServerSocket
学习分享:
一、 TCP,UDP比较
TCP | UDP |
可靠,三次握手 | 不可靠 |
传输速度慢 | 传输速度快 |
响应式 | 发送出去不管有没有接收 |
基于传输层 |
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) {
}
}
}
}
相关文章推荐
- http://www.cnblogs.com/xdp-gacl/p/3902537.html
- TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节
- linux笔记:linux常用命令-网络命令
- 网络虚拟化
- JSON 解析 网络 上 天气预报
- KVM的网络Networking-qemu-kvm和openvswitch原型环境部署和基本测试 (3)
- http://www.cnblogs.com/sunada2005/p/4119080.html
- 获取Http协议的请求行,请求头
- Unity 获取网络北京时间
- CentOS7安装配置Apache HTTP Server
- Apache中Httpd.conf详解
- http劫持
- Apache环境.htaccess伪静态强制https跳转访问设置
- 判断手机网络状况
- Java网络编程 流
- 使用apache的httpclient发送post请求传送和解析json
- HttpClient4.5.2 使用cookie保持会话——如何传递多个cookie(3)
- 网络安全学院
- Using a socks proxy with git for the http transport
- TCP/IP协议简单解释