『壹』 在java中实现TCP协议编程中怎么传
在Java中实现TCP协议编程
ServerSocket:编写TCP网络服务程序,首先要用到java.net.ServerSocket类用以创建服务器Socket
构造方法:
ServerSocket(intport):创建绑定到特定端口的服务器套接字
ServerSocket(intport,intbacklog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(intport,intbacklog,InetAddressbindAddr):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
Socket:客户端要与服务器建立连接,必须先创建一个Socket对象
常用构造方法
Socket(Stringhost,intport):创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(InetAddressaddress,intport):创建一个流套接字并将其连接到指定IP地址的指定端口号。
服务器端程序调用ServerSocket类中的accept()方法等待客户端的连接请求,一旦accept()接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象。建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket类中的getInputStream()返回Socket的输入流对象,getOutputStream()返回Socket的输出流对象。
TCP服务器与TCP客户端间的数据的接受图示:
用TCP实现服务器与客户端的“聊天”:
实例代码:
客户端:
packagecom.hbsi.net;
importjava.net.Socket;
importjava.io.*;
publicclassTcpClient{
publicstaticvoidmain(String[]args)throwsException{
//1.建立tcp客户端socket,要确定要连接的服务器ip,port
Sockets=newSocket("192.168.49.87",9009);
//获取键盘录入
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
//2.通过建立的socket,获取输出流对象
//数据输出给服务器端
OutputStreamout=s.getOutputStream();
BufferedWriterbwout=newBufferedWriter(newOutputStreamWriter(out));
//获取服务器端返回的数据
//读取服务器端发过来的信息InputStreamReader()
BufferedReaderbrin=newBufferedReader(newInputStreamReader(
s.getInputStream()));
Stringline=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
Stringstr=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}
服务器端:
packagecom.hbsi.net;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassTcpServer{
publicstaticvoidmain(String[]args)throwsException{
//1.建立服务器socket
ServerSocketss=newServerSocket(9009);
//2.调用accept()
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+"...connection");
//读取客户的信息的输入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=newBufferedReader(newInputStreamReader(in));
//向客户端发送信息输出流,服务端向客户端返回信息OutputStreamWriter()
BufferedWriterbrout=newBufferedWriter(newOutputStreamWriter(
s.getOutputStream())); Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());//服务器端收到信息后,将信息转为大写返回给客户端toUpperCase()
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}
『贰』 求TCP/IP client server socket的JAVA代码
我这刚好有一个,给你参考一下:(分客户端和服务器两个小程序)
//客户端程序及聊天室的图形用户界面
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class ChatTCPSocketJFrame extends JFrame implements ActionListener
{
private String name; //网名
private Socket socket; //TCP Socket对象
private JTextArea text_receiver; //显示对话内容的文本区
private JTextField text_sender; //输入发送内容的文本行
private JButton button_send,button_leave; //发送和离线按钮
private PrintWriter cout; //字符输出流对象
public ChatTCPSocketJFrame(String name, Socket socket) throws IOException//提供图形用户界面
{
super("聊天室 "+name+" "+InetAddress.getLocalHost()+" : "+socket.getLocalPort());
this.setBounds(320,240,400,240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.text_receiver = new JTextArea();
this.text_receiver.setEditable(false); //文本区不可编辑
this.getContentPane().add(new JScrollPane(this.text_receiver));
JPanel panel = new JPanel();
this.getContentPane().add(panel,"South");
this.text_sender = new JTextField(16);
panel.add(this.text_sender);
button_send = new JButton("发送");
panel.add(button_send);
button_send.addActionListener(this);
button_leave = new JButton("离线");
panel.add(button_leave);
button_leave.addActionListener(this);
this.setVisible(true);
this.name = name;
this.socket = socket;
this.cout = new PrintWriter(socket.getOutputStream(),true);//获得Socket对象的输出流,立即flush
this.cout.println(name); //发送自己网名给对方
BufferedReader cin=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获得Socket对象的输入流,创建字符输入流
String aline=cin.readLine(); //接收到对方网名
text_receiver.append("连接"+aline+"成功"+"\r\n"); //显示对方发来的内容
aline= cin.readLine();
while (aline!=null && !aline.equals("bye")) //从输入流接收对方发来的字符串
{ //"bye"是约定的离线信息
text_receiver.append(aline+"\r\n"); //显示对方发来的内容
aline= cin.readLine();
}
cin.close();
cout.close();
socket.close(); //关闭Socket连接
button_send.setEnabled(false);
button_leave.setEnabled(false);
}
public ChatTCPSocketJFrame(String name, String host, int port) throws IOException //客户端
{
this(name, new Socket(host, port)); //客户端向指定主机的端口发出TCP连接请求
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==button_send) //发送按钮
{
this.cout.println(name+" 说:"+text_sender.getText()); //通过流发送给对方
text_receiver.append("我说:"+text_sender.getText()+"\n");
text_sender.setText("");
}
if (e.getSource()==button_leave) //离线
{
text_receiver.append("我离线\n");
this.cout.println(name+"离线\n"+"bye"); //发送给对方离线约定
button_send.setEnabled(false);
button_leave.setEnabled(false);
}
}
public static void main(String args[]) throws IOException
{
new ChatTCPSocketJFrame("小蜜蜂", "127.0.0.1", 2001);
}
}
//服务端程序
import java.net.*;
import java.io.*;
public class ChatTCPServer
{
public ChatTCPServer(int port, String name) throws IOException //约定端口、网名
{ //本机IP地址和指定端口构成服务端的Socket
ServerSocket server = new ServerSocket(port); //ServerSocket提供TCP连接服务
Socket client = server.accept(); //等待接收客户端的连接申请
new ChatTCPSocketJFrame(name,client); //服务端的聊天室,图形用户界面同客户端
server.close();
}
public static void main(String args[]) throws IOException
{
new ChatTCPServer(2001, "花仙子"); //启动服务端,约定端口,指定网名
}
}
『叁』 急缺一个vb网络通信代码。基于tcp/ip, 要简单明了,一定要加注解。
TCP连接初步
如果应用程序要使用TCP协议,那么首先必须决定应用程序是服务器还是客户端。
如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客户端提出
连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客户端与服务
器端可以自由地互相通讯。
下列步骤创建一个非常简单的服务器:
要创建一个TCP服务器,请按照以下步骤执行:
创建新的StandardEXE工程。
将缺省窗体的名称改为frmServer。
将窗体的标题改为“TCP服务器”。
在窗体中放入一个Winsock控件,并将它的名字改为tcpServer。
在窗体上添加两个TextBox控件。将第一个命名为txtSendData,第二个为txtOutput。
为窗体添加如下的代码。
PrivateSubForm_Load()
'将LocalPort属性设置为一个整数。
'然后调用Listen方法。
tcpServer.LocalPort=1001
tcpServer.Listen
frmClient.Show'显示客户端的窗体。
EndSub
PrivateSubtcpServer_ConnectionRequest_
(ByValrequestIDAsLong)
'检查控件的State属性是否为关闭的。
'如果不是,
'在接受新的连接之前先关闭此连接。
IftcpServer.State<>sckClosedThen_
tcpServer.Close
'接受具有requestID参数的
'连接。
tcpServer.AcceptrequestID
EndSub
PrivateSubtxtSendData_Change()
'名为txtSendData的TextBox控件中
'包含了要发送的数据。当用户往文本框中
'键入数据时,使用SendData方法
'发送输入的字符串。
tcpServer.SendDatatxtSendData.Text
EndSub
PrivateSubtcpServer_DataArrival_
(ByValbytesTotalAsLong)
'为进入的数据声明一个变量。
'调用GetData方法,并将数据赋予名为txtOutput
'的TextBox的Text属性。
DimstrDataAsString
tcpServer.GetDatastrData
txtOutput.Text=strData
EndSub
上面的步骤创建了一个简单的服务器应用程序。为了使它能够工作,
还必须为它创建一个客户端的应用程序。
要创建TCP客户端,请按照以下步骤执行:
在工程中添加一个新的窗体,将其命名为frmClient。
将窗体的标题改为“TCPClient”。
在窗体中添加一个Winsock控件,并将其命名为tcpClient。
在frmClient中添加两个TextBox控件。将第一个命名为txtSend,第二个为txtOutput。
在窗体上放一个CommandButton控件,并将其命名为cmdConnect。
将CommandButton控件的标题改为Connect。
在窗体中添加如下的代码。
重点必须将RemoteHost属性值修改为您的计算机的名字。
PrivateSubForm_Load()
'Winsock控件的名字为tcpClient。
'注意:要指定远程主机,可以使用
'IP地址(例如:"121.111.1.1"),也可以使用
'计算机的“好听的名字”如下所示。
tcpClient.RemoteHost="RemoteComputerName"
tcpClient.RemotePort=1001
EndSub
PrivateSubcmdConnect_Click()
'调用Connect方法,初始化连接。
tcpClient.Connect
EndSub
PrivateSubtxtSendData_Change()
tcpClient.SendDatatxtSend.Text
EndSub
PrivateSubtcpClient_DataArrival_
(ByValbytesTotalAsLong)
DimstrDataAsString
tcpClient.GetDatastrData
txtOutput.Text=strData
EndSub
上面的代码创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:
运行工程,然后单击“连接”。在两个窗体之一的txtSendData文本框中键入文本,可
以看到同样的文字将出现在另一个窗体的txtOutput文本框中。