Java网络编程
Posted 菜菜小谭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络编程相关的知识,希望对你有一定的参考价值。
***********************第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 只有碰到
的时候 才认为真正读进来数据,解决方案 说话的时候 都要加一个
以上是关于Java网络编程的主要内容,如果未能解决你的问题,请参考以下文章