- 1、网络编程要解决的问题
- 2、Java网络编程
- 1、TCP网络编程
- 2、UDP网络编程
- 3、URL网络编程
- 3、网络编程的阻塞问题
- 如何定位到其他计算机
- 如何稳定的进行传输数据
对此提出了三个概念,其中IP与端口组成了套接字(Socket),用于区分计算机上的服务
- IP地址
- 端口
- 通信协议
计算机网络的内容就不在这普及了
2、Java网络编程- TCP网络编程
- UDP网络编程
- URL网络编程
- Socket类:表示要通信的对象
- InetAddress类:表示IP地址
- ServerSocket类:表示服务端
Socket
构造方法
//创建一个流套接字并将其连接到指定主机上的指定端口号。
1 public Socket(String host, int port) throws UnknownHostException, IOException.
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
2 public Socket(InetAddress host, int port) throws IOException
//创建一个套接字并将其连接到指定远程主机上的指定远程端口
3 public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
//创建一个套接字并将其连接到指定远程地址上的指定远程端口
4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
//通过系统默认类型的 SocketImpl 创建未连接套接字
5 public Socket()
=================================================================
常用方法
//将此套接字连接到服务器,并指定一个超时值。
1 public void connect(SocketAddress host, int timeout) throws IOException
//返回套接字连接的地址。
2 public InetAddress getInetAddress()
//返回此套接字连接到的远程端口。
3 public int getPort()
//返回此套接字绑定到的本地端口。
4 public int getLocalPort()
//返回此套接字连接的端点的地址,如果未连接则返回 null。
5 public SocketAddress getRemoteSocketAddress()
//返回此套接字的输入流。
6 public InputStream getInputStream() throws IOException
//返回此套接字的输出流。
7 public OutputStream getOutputStream() throws IOException
//关闭此套接字。
8 public void close() throws IOException
ServerSocket
//创建绑定到特定端口的服务器套接字。
public ServerSocket(int port) throws IOException
//侦听并接受到此套接字的连接。
public Socket accept() throws IOException
应用
@Test
public void client() throws IOException {
PrintWriter writer = null;
Socket socket = null;
try {
InetAddress address = InetAddress.getByName("127.0.0.1");
socket = new Socket(address,6666);
OutputStream outputStream = socket.getOutputStream();
writer = new PrintWriter(outputStream);
writer.print("hello world");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (socket != null)
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Test
public void server() throws IOException {
Socket accept = null;
InputStream inputStream = null;
ServerSocket socket = null;
try {
socket = new ServerSocket(6666);
accept = socket.accept();
inputStream = accept.getInputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null)
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (accept != null)
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、UDP网络编程
应用
public class Server {
public static void main(String[] args) {
try {
DatagramSocket server = new DatagramSocket(5060);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
server.receive(packet);
System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + new String(packet.getData()));
packet.setData("Hello Client".getBytes());
packet.setPort(5070);
packet.setAddress(InetAddress.getLocalHost());
server.send(packet);
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
===================================================================
public class Client {
public static void main(String[] args){
try {
DatagramSocket client = new DatagramSocket(5070);
DatagramPacket packet = new DatagramPacket(new byte[1024],1024);
packet.setPort(5060);
packet.setAddress(InetAddress.getLocalHost());
packet.setData("Hello Server".getBytes());
client.send(packet);
client.receive(packet);
System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + new String(packet.getData()));
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、URL网络编程
URL网络编程
3、网络编程的阻塞问题我的客户端发送一个时间给服务端,然后服务端接收这个数据并给客户端返回一个数据,然后客户端接收这个数据并输出。
我在实现这个功能的时候,发现客户端和服务端启动后都被阻塞住了,原因是当客户端给服务端发送完数据的时候服务端在读取数据,但是服务端没有办法判断什么时候会自动中断,所以他会在这个地方阻塞。阻塞之后服务端就没有办法往客户端发送数据,这个时候客户端的接收数据也会等服务端的数据,会在这里阻塞。这个时候服务端和客户端都不会关闭,会一直持续阻塞。
造成这个问题一共有两个原因,
第一传递数据的时候,另一端不知道什么时候终止,用read!=-1是没有办法判断出来的,因为流没有终止,流一直存在,所以另一端以为数据没有传输完毕。
第二,如果数据量不够大的话,就会造成数据被写入内存,而没有被传输过去,只是被放到了内存。
解决这两个问题,第一个问题就是,在传输结束之后,你可以把流进行关闭,使用socket.shutdownOutput()和socket.shutdownInput()这两个方法,将流关闭掉,对面就可以接收到结束的信号。第二个在你传输的时候随时记得刷新一下flush()或者使用一些会自动刷新的写的方法如println();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)