java socket编写服务器,java的socket编程用的多吗

浅谈Java中如何利用socket进行网络编程(一)

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上的数据的传递。在java中,有专门的socket类来处理用户的请求和响应。利用SOCKET类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在JAVA中如何利用socket进行网络编程。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。程序可以对这些数据流根据需要进行进一步的封装。本文的例子就对这些数据流进行了一定的封装(关于封装可以参考Java中流的实现部分)。一、建立服务器类 Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocket server= new ServerSocket(9998)这条语句创建了一个服务器对象,这个服务器使用9998号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socket incoming= server.accept()进而得到输入流和输出流,并进行封装BufferedReader in= new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out= new PrintWriter(incoming.getOutputStream(),true);随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。

JAVA 问题,用socket编写一个客户端程序

给你一个我写的示例,用的是基于TCP的Socket技术,你锻炼一下,改一改,不会改再找我!

客户端:

import java.net.Socket;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.InputStreamReader;

import java.io.BufferedReader;

public class TcpClient{

public static void main(String[] args) throws Exception

{

//创建客户端Socket服务,并且制定主机和duank

Socket s= new Socket("192.168.1.104",10002);//连接固定的主机和端口

//为了发送数据,获取Socket中的输入输出流

OutputStream out= s.getOutputStream();

InputStreamReader isr= new InputStreamReader(System.in);

BufferedReader br= new BufferedReader(isr);

String line= null;

//读取服务器发过来的数据

InputStream in= s.getInputStream();

byte[] buf= new byte[1024];

while((line= br.readLine())!=null)

{

out.write(line.getBytes());

if("886".equals(line))

break;

int len= in.read(buf);

String content= new String(buf,0,len);

System.out.println("Server:"+content);

}

s.close();

}

}

服务器:

/*

*需求分析:

*使用TCP协议,写服务器端。做到服务器能收到客户端的信息,也能向客户端发送信息

**/

package JavaNetProgramming;

import java.net.ServerSocket;

import java.net.Socket;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.InputStreamReader;

import java.io.BufferedReader;

public class TcpServer{

public static void main(String[] args) throws Exception

{

//建立服务器的Socket服务,并且监听一个端口

ServerSocket ss= new ServerSocket(10002);

Socket s= ss.accept();

InputStream is= s.getInputStream();

//从服务器端向客户端发送数据

OutputStream out= s.getOutputStream();

InputStreamReader isr= new InputStreamReader(System.in);

BufferedReader br= new BufferedReader(isr);

String line= null;

while(true)

{

//通过accept()方法获得客户端传过来的Socket对象

// System.out.println("getByNanme():"+s.getInetAddress());

System.out.print("getHostAddress():"+s.getInetAddress().getHostAddress());

//获取客户端发过来的数据,就要使用客户端对象的读取流来读取数据

byte[] buf= new byte[1024];

int len= is.read(buf);//把流中数据读到字节数组中

String content= new String(buf,0,len);

System.out.println(""+content);

if("886".equals(content))

break;

while((line= br.readLine())!=null)

{

out.write(line.getBytes());

break;

}

}

s.close();//循环内有判断语句,这句话才不出错

ss.close();

}

}

Java Socket常见异常处理

在java网络编程Socket通信中通常会遇到以下异常情况

第个异常是 BindException:Address already in use: JVM_Bind

该异常发生在服务器端进行new ServerSocket(port)(port是一个的整型值)操作时异常的原因是以为与port一样的一个端口已经被启动并进行监听此时用netstat an命令可以看到一个Listending状态的端口只需要找一个没有被占用的端口就能解决该问题了

第个异常是 ConnectException: Connection refused: connect

该异常发生在客户端进行 new Socket(ip port)操作时该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由)或者是该ip存在但找不到指定的端口进行监听出现该问题首先检查客户端的ip和port是否写错如果正确则从客户端ping一下服务器看是否能ping通如果能ping通(服务器端把ping禁掉则需要另外的办法)则看在服务器端的监听指定端口的程序是否启动这个肯定能解决这个问题

第个异常是 SocketException: Socket is closed

该异常在客户端和服务器均可能发生异常的原因是本端主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作

第个异常是 SocketException:(Connection reset或者Connect reset by peer:Socket write error)

该异常在客户端和服务器端均有可能发生引起该异常的原因有两个第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭)另一端仍发送数据发送的第一个数据包引发该异常(Connect reset by peer)另一个是一端退出但退出时并未关闭该连接另一端如果在从连接中读数据则抛出该异常(Connection reset)简单的说就是由连接断开后的读和写操作引起的

第个异常是 SocketException: Broken pipe

该异常在客户端和服务器均有可能发生在第个异常的第一种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后)如果再继续写数据则抛出该异常前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接其次是要检测对方的关闭连接操作发现对方关闭连接后自己也要关闭该连接

二.编写网络程序时需要注意的问题:

是要正确区分长短连接所谓的长连接是指一经建立就永久保持短连接的情况是准备数据—>建立连接—>发送数据—>关闭连接很多的程序员写了多年的网络程序居然不知道什么是长连接什么是短连接

是对长连接的维护所谓维护包括两个方面首先是检测对方的主动断连(即调用 Socket的close方法)其次是检测对方的宕机异常退出及网络不通这是一个健壮的通信程序必须具备的检测对方的主动断连很简单主要一方主动断连另一方如果在进行读操作则此时的返回值只一旦检测到对方断连则应该主动关闭本端的连接(调用Socket的close方法)而检测对方的宕机异常退出及网络不通常用方法是用心跳也就是双方周期性的发送数据给对方同时也从对方接收心跳如果连续几个周期都没有收到对方心跳则可以判断对方宕机异常退出或者网络不通此时也需要主动关闭本端连接如果是客户端可在延迟一定时间后重新发起连接虽然Socket有一个keep alive选项来维护连接如果用该选项一般需要两个小时才能发现对方的宕机异常退出及网络不通

lishixinzhi/Article/program/Java/hx/201311/26630

阅读剩余
THE END