码迷,mamicode.com
首页 > 编程语言 > 详细

Java网络编程(一)

时间:2018-11-05 01:11:50      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:随机   使用   演示   cat   京东   rac   文件传输   com   输入流   

***********************第15章 socket编程(网络编程)************************

网络编程 != 网站编程


京东 淘宝 网站编程


网络
QQ----------------->QQ


一.为什么使用socket

当两个应用程序之间需要交换数据的时候 需要使用socket


QQ聊天或者传文件


二.什么是socket


插座的意思


在编程中socket翻译成套接字


一组API,功能是用来解决两个应用程序之间传输数据的问题..


套接字= ip地址 + 端口号


ip地址: 用来唯一的标示一台主机


端口号: 用来唯一的标示一个进程... 占2个字节 2的16次方 65536种可能

TCP 65536 UDP 65536

 

****************************************TCP和UDP的区别*************************

1.TCP

传输控制协议 面向连接的 安全的 有顺序的 就像打电话 QQ视频用的是TCP


三次握手

 


2.UDP

用户数据报协议 面向无连接的 不安全的 没有顺序 就像写信一样 CS QQ聊天发信息都使用的是UDP

 


*************************************如何使用socket************************************

现在写的程序 都要写两个应用程序


服务器端的插座 ServerSocket

客户端的插座 Socket


先写服务器端、再写客户端

 


Socket的优点: 只要用户建立好socket连接以后, socket技术就把两个应用程序之间传输数据的问题

给你简化成I/O操作了....


1.服务器端

Server.java


package com.chapter15;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

//服务器端
public class Server {

public static void main(String[] args) {


//TCP socket
//一.建立socket连接

//1.新建ServerSocket
ServerSocket ss = null;
Socket socket = null;

try {
ss = new ServerSocket(8888);

socket = ss.accept();//阻塞式 傻傻的等待

System.out.println("有一个客户端连接");
} catch (IOException e) {

System.out.println("端口号已被占用");
e.printStackTrace();
}

//二.I/O操作



//三.关闭socket连接
if(socket!=null){

try {
socket.close();
} catch (IOException e) {
System.out.println("关闭socket失败");
e.printStackTrace();
}
}


}
}

 

2.客户端

Client.java


package com.chapter15;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

//客户端
public class Client {

public static void main(String[] args) {

// 一.建立socket连接
// 2.申请连接 相当于打电话的拨号
// 第一个参数 是要连接的服务器的ip地址
// 现在我要连接的是本地这台机器 localhost 127.0.0.1--->真实的本机ip
Socket socket = null;
try {
socket = new Socket("localhost", 8888);// 系统会为客户端的插座
// 随机分配一个1024以上的端口号
} catch (UnknownHostException e) {
System.out.println("主机不存在");
e.printStackTrace();
} catch (IOException e) {
System.out.println("连接失败");
e.printStackTrace();
}

// 二.I/O操作

// 三.关闭socket连接
if (socket != null) {

try {
socket.close();
} catch (IOException e) {
System.out.println("关闭socket失败");
e.printStackTrace();
}
}
}
}

 

***************************************常见错误*******************************************


常见错误1:


端口号已被占用
java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:382)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at com.chapter15.Server.main(Server.java:21)


说明已经有应用程序使用8888端口了,解决方案 把之前8888端口上的进程杀掉即可... 杀占用内存小的那个javaw

 


*************************************演示文件传输功能***********************************

原理: 两次复制

 

************************************模拟QQ 实现1对1聊天************************

 

需求1: 客户端给服务器说一句话: 你好,服务器

ok


需求2: 服务器 给客户端 回一句 : 你坏,客户端

java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Socket.java:943)
at com.chapter15.演示一对一聊天.Server.main(Server.java:74)
Exception in thread "main" java.lang.NullPointerException
at com.chapter15.演示一对一聊天.Server.main(Server.java:82)


Socket被关闭了,而且socket并没有关闭 是在最后关闭的...

 

*********************************发生如下四种情况的时候会关闭socket连接**************************


1. 调用socket对象的close()方法 主动关闭socket


2. 如果关闭了socket中的 输入流或输出流关闭了,socket也自动关闭了


3. 应用程序结束后,socket也会自动关闭


4. Socket socket = new Socket();

Socket socket = null;

socket = new Socket();

 

socket对象置空,或者是让这个socket对象的引用 引用一个新的socket对象 原来的socket对象就会变成垃圾,被垃圾
回收器进行回收,内存回收完以后,socket会关闭

 

刚才是由于把输入流或输出流关了,所以socket自动关闭了,解决方案,在服务器回复完以后 再关输入流

*************************改完以后虽然不报SocketException了,但是阻塞了**************************


原因是BufferedReader 只有碰到\n的时候 才认为真正读进来数据,解决方案 说话的时候 都要加一个\n

 

Java网络编程(一)

标签:随机   使用   演示   cat   京东   rac   文件传输   com   输入流   

原文地址:https://www.cnblogs.com/MrTanJunCai/p/9906837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!