-- tcp 分为客户端和服务端
-- 客户端对应的对象是 socket
-- 服务端对应的对象是 serversocket
-- 如果客户端先启动,则出现 connection refused 异常 //refused 拒绝
客户端创建socket 对象时,就可以连接服务器,连接成功后,即形成通路,进行数据交换
import java.net.*;import java.io.*; //tcp客户端class tclient{public static void main(string [] args) throws exception { socket socket=new socket(127.0.0.1,9000); //取得 socket 中的输出流outputstream out =socket.getoutputstream(); out.write(这是客户端向主机输出的数据.getbytes()); //取得服务端发回的数据inputstream in=socket.getinputstream();byte [] buff=new byte[1024];int len =in.read(buff); string str=new string(buff,0,len); system.out.println(服务端返回的数是:+str); out.close(); in.close(); socket.close(); } }
//tcp服务端/* 1 创建serversocket ,指定要监听的端口 2 通过 serversocket 的 accept 方法 (它是阻塞模式的) 取得连接上来的客户端对象 3 与客户端连通后,就可以得到客户端对象,并使用客户端对象读取流来取得数据 4 如果有必要,释放资源*/import java.io.*;import java.net.*;class tserver {public static void main(string [] args) throws exception { serversocket serversocket=new serversocket(9000); //指定监听的端口socket clientsocket=serversocket.accept(); //通过客户端的socket对象可以取得信息string clientip=clientsocket.getinetaddress().gethostaddress();int clientport=clientsocket.getport(); system.out.println(clientip+:+clientport +连接成功); inputstream in= clientsocket.getinputstream();byte[] buff=new byte[1024];int len=in.read(buff); //len 表示读了多少个字节 注意,这个read 是阻塞的 string msg=new string(buff,0,len); system.out.println(msg); //往回发送数据outputstream out=clientsocket.getoutputstream(); out.write(小样的客户端,你竞敢骂人?,我也能.getbytes()); */ out.close(); in.close(); serversocket.close(); clientsocket.close(); } }
例子 从客户端向服务端发字母,变成大写后反回
/*客户端: 1 建立服务 2 获取键盘录入 3 将数入的数据发给服务端 4 接收服务端返回的大写字母 5 关闭资源 备注: 使用带缓冲的字符流进行操作 */import java.io.*;import java.net.*;class transclient {public static void main(string [] args) throws exception { socket socket=new socket(127.0.0.1,8000); //定义输入流,读取键盘数据bufferedreader br=new bufferedreader(new inputstreamreader(system.in)); //定义输出流对象(用于将键盘数据写入到输出流中)bufferedwriter bw=new bufferedwriter(new outputstreamwriter(socket.getoutputstream())); //定义一个socket 读取流,读取服务器返回的大写字母bufferedreader brresult=new bufferedreader(new inputstreamreader(socket.getinputstream())); string str=null;while((str=br.readline())!=null){ //从键盘开始读取bw.write(str); //向服务端输出 bw.newline(); bw.flush(); //千万别忘了 system.out.println(服务端返回的数据是+brresult.readline()); //取出变大写后的字符串 } socket.close(); br.close(); bw.close(); brresult.close(); } }
//服务端 import java.net.*;import java.io.*;class transserver {public static void main(string [] args) throws exception { serversocket serversocket=new serversocket(8000); socket clientsocket=serversocket.accept(); //读取socket流中的数据(从客户端发过来的小写字母) bufferedreader br=new bufferedreader(new inputstreamreader( clientsocket.getinputstream())); //创建输出流对象,往clientsocket 的流中写入转换后的大写字母 bufferedwriter bw=new bufferedwriter(new outputstreamwriter( clientsocket.getoutputstream())); string str=null; while((str=br.readline())!=null) //注意 readline 的特性,它是要一直读取回车换行才返回 { bw.write(str.touppercase()); bw.newline(); bw.flush(); //千万别忘了 } br.close(); bw.close(); clientsocket.close(); serversocket.close(); } }
例子 上传文件
//客户端 import java.io.*;import java.net.*;class upclient {public static void main(string [] args) throws exception { socket socket=new socket(127.0.0.1,7000); bufferedreader br=new bufferedreader(new filereader(c:\\作业\\名单.txt)); //用来读文件的输入流bufferedwriter bw=new bufferedwriter(new outputstreamwriter(socket.getoutputstream())); //用来把文件往服务端传 //往scoket中一行一行的写入数据string content=null;while((content=br.readline())!=null){ bw.write(content); bw.newline(); bw.flush(); } socket.shutdownoutput(); //关闭客端的输出流同,当相于加入一个结束标记(-1),要不然服务端会不停的等 //取出服务端返回的信息bufferedreader brresult=new bufferedreader(new inputstreamreader(socket.getinputstream())) ; system.out.println( brresult.readline()); bw.close(); br.close(); socket.close(); } }
//服务端 import java.io.*;import java.net.*;class upserver {public static void main(string [] args) throws exception { serversocket serversocket=new serversocket(7000); socket clientsocket=serversocket.accept(); system.out.println(clientsocket.getinetaddress().gethostaddress()+已经连接...); //打印一下客户端连上的的信息 //读取客户端发过的来的数据bufferedreader br=new bufferedreader(new inputstreamreader(clientsocket.getinputstream())); bufferedwriter bw=new bufferedwriter(new filewriter(e:/xxx.exe)); string str=null;while((str=br.readline())!=null){ //如果客户端不发结束标记,它就不会返回 bw.write(str); bw.newline(); bw.flush(); } //再向发送端返回一条提示息 bufferedwriter bwresult=new bufferedwriter(new outputstreamwriter(clientsocket.getoutputstream())); bwresult.write(文件上传成功); bwresult.flush(); serversocket.close(); clientsocket.close(); bwresult.close(); bw.close(); br.close(); }
例子 上传图片
客户端import java.net.*;import java.io.*;class imgclient {public static void main(string [] ars) throws exception { socket socket=new socket(127.0.0.1,7000); fileinputstream fis=new fileinputstream(c:\\image\\0.jpg); //文件输入流outputstream out=socket.getoutputstream(); byte [] buff =new byte[1024];int len=0;while((len=fis.read(buff))!=-1){ //一边读数据,一边传数据out.write(buff,0,len); //字节流,不用flush, 和 newline() } socket.shutdownoutput(); //加一个结束标记,表示输入流结束 //取出服务端发过来的信息bufferedreader brresult=new bufferedreader(new inputstreamreader(socket.getinputstream())); system.out.println(brresult.readline()); socket.close(); fis.close(); } }
服务端import java.net.*;import java.io.*;class imgserver {public static void main(string [] args) throws exception { serversocket serversocket=new serversocket(7000); socket clientsocket=serversocket.accept(); system.out.println(clientsocket.getinetaddress().gethostaddress()+ 已连接); inputstream in=clientsocket.getinputstream(); //取数据用的流fileoutputstream fos=new fileoutputstream(e:\\xxx.jpg); byte [] buff=new byte[1024];int len=0;while((len=in.read(buff))!=-1){ fos.write(buff,0,len); //不用flush 因为是字节流 } bufferedwriter br=new bufferedwriter(new outputstreamwriter(clientsocket.getoutputstream())); br.write(图片上传成功); br.flush(); //别忘了 serversocket.close(); clientsocket.close(); br.close(); fos.close(); } }
例子 多线程并发上传图片
服务端 import java.net.*;class picserver {public static void main(string [] args) throws exception { serversocket serversocket=new serversocket(9000); while(true) { socket clientsocket=serversocket.accept();new thread(new picthread(clientsocket)).start(); } } }
import java.io.*;import java.net.*;class picthread implements runnable{private socket clientsocket;public picthread(socket socket) { clientsocket=socket; }public void run() {try{ string clientip=clientsocket.getinetaddress().gethostaddress(); fileoutputstream fos=new fileoutputstream(e:\\+clientip); inputstream in =clientsocket.getinputstream(); //从套接字中取出数据byte[] buff=new byte[1024];int len=0;while((len=in.read(buff))!=-1) //把数据从流中读出,写入文件 { fos.write(buff,0,len); } bufferedwriter br=new bufferedwriter(new outputstreamwriter(clientsocket.getoutputstream())); br.write(图片上传成功); br.flush(); clientsocket.close(); fos.close(); in.close(); }catch(exception ex){ system.out.println(出错了); } } }
客户端 import java.io.*;import java.net.*;class picclient{public static void main(string [] args) throws exception { string filename=args[0];//string filename=c:\\image\\2.jpg; //进行验证file file=new file(filename);if(!(file.exists()&&file.isfile())) //验证文件是不是存在 { system.out.println(输入的文件名错误或是个目录);return; } if( !file.getname().endswith(.jpg)){ system.out.println(文件类型不正确);return ; } if( file.length() >1024*1024){ system.out.println(你想干啥,整这么大的文件上来? 不行);return; } socket socket=new socket(127.0.0.1,9000); fileinputstream fis=new fileinputstream(filename); //构建文件输入流outputstream out=socket.getoutputstream(); //输出流byte [] buff=new byte[1024]; int len=0;while((len=fis.read(buff))!=-1) //一边读入,一边往文件中写出 { out.write(buff,0,len); } socket.shutdownoutput(); //取出服务端发过来的信息bufferedreader brresult=new bufferedreader(new inputstreamreader(socket.getinputstream())); system.out.println(brresult.readline()); socket.close(); fis.close(); brresult.close(); out.close(); } }
以上就是java基础入门之网络编程教程的详细内容。